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.
This commit is contained in:
Cary Coutant
2018-06-22 23:36:50 -07:00
parent a1893a821c
commit a2575bec24
9 changed files with 320 additions and 83 deletions

View File

@@ -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<size>(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)