From a2575bec2413d361c6ecfc4aecb2a31c86123f95 Mon Sep 17 00:00:00 2001 From: Cary Coutant Date: Fri, 22 Jun 2018 23:36:50 -0700 Subject: Update support for .note.gnu.property sections. The original patch did not give the target enough hooks to discover that an input object file does not have a particular property. For the GNU_PROPERTY_X86_FEATURE_1_AND property, for example, where a missing property should be assumed to be all zeroes, and ANDed with other object modules, this is essential. We now store the target-specific properties locally in the Target structure as native uint32_t fields, then AND the per-object feature bits with the program's feature bits when we're finished processing each input object file. The target-specific properties are then added back to the output note section during finalization. gold/ PR gold/22914 * layout.cc (read_sized_value): Fix spelling of section name. (Layout::layout_gnu_property): Call Sized_target::record_gnu_property for target-specific properties; don't store them with target-independent properties yet. (Layout::merge_gnu_properties): New method. (Layout::add_gnu_property): New method. (Layout::create_gnu_properties_note): Call target to finalize target-specific properties. Fix spelling of output section name. * layout.h (Layout::merge_gnu_properties): New method. (Layout::add_gnu_property): New method. * object.cc (Sized_relobj_file::do_layout): Call Layout::merge_gnu_properties. * target.h (Target::merge_gnu_property): Remove. (Target::finalize_gnu_properties): New method. (Target::do_merge_gnu_property): Move to Sized_target and rename. (Target::do_finalize_gnu_properties): New virtual method. (Sized_target::record_gnu_property): Moved and renamed from Target::do_merge_gnu_property. (Sized_target::merge_gnu_properties): New virtual method. * x86_64.cc (Target_x86_64::isa_1_used_, isa_1_needed_) (feature_1_, object_feature_1_, seen_first_object_): New data members. (Target_x86_64::do_merge_gnu_property): Rename to ... (Target_x86_64::record_gnu_property): ... this. Save target-specific properties in Target class object. (Target_x86_64::merge_gnu_properties): New method. (add_property): New static inline function. (Target_x86_64::do_finalize_gnu_properties): New method. * testsuite/Makefile.am (gnu_property_test): Remove C source file; link directly without compiler driver. * testsuite/Makefile.in: Regenerate. * testsuite/gnu_property_a.S: Add _start. --- gold/target.h | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) (limited to 'gold/target.h') diff --git a/gold/target.h b/gold/target.h index 1f8f757..bb31206 100644 --- a/gold/target.h +++ b/gold/target.h @@ -509,22 +509,10 @@ class Target should_include_section(elfcpp::Elf_Word sh_type) const { return this->do_should_include_section(sh_type); } - // Merge a target-specific program property in the .note.gnu.properties - // section. + // Finalize the target-specific properties in the .note.gnu.property section. void - merge_gnu_property(int note_type, - int pr_type, - size_t new_pr_datasz, - const unsigned char* new_pr_data, - size_t old_pr_datasz, - unsigned char* old_pr_data, - const Object* object) const - { - return this->do_merge_gnu_property(note_type, pr_type, - new_pr_datasz, new_pr_data, - old_pr_datasz, old_pr_data, - object); - } + finalize_gnu_properties(Layout* layout) const + { this->do_finalize_gnu_properties(layout); } protected: // This struct holds the constant information for a child class. We @@ -832,11 +820,9 @@ class Target do_should_include_section(elfcpp::Elf_Word) const { return true; } - // Merge a target-specific program property in the .note.gnu.properties - // section. + // Finalize the target-specific properties in the .note.gnu.property section. virtual void - do_merge_gnu_property(int, int, size_t, const unsigned char*, - size_t, unsigned char*, const Object*) const + do_finalize_gnu_properties(Layout*) const { } private: @@ -1158,6 +1144,17 @@ class Sized_target : public Target return elfcpp::elf_r_sym(rel.get_r_info()); } + // Record a target-specific program property in the .note.gnu.property + // section. + virtual void + record_gnu_property(int, int, size_t, const unsigned char*, const Object*) + { } + + // Merge the target-specific program properties from the current object. + virtual void + merge_gnu_properties(const Object*) + { } + protected: Sized_target(const Target::Target_info* pti) : Target(pti) -- cgit v1.1