forked from Imagelibrary/binutils-gdb
Add support for .note.gnu.property sections.
elfcpp/ PR gold/22914 * elfcpp.h (NT_GNU_PROPERTY_TYPE_0): New note type. (GNU_PROPERTY_*): New Gnu property types. * x86_64.h (GNU_PROPERTY_X86_FEATURE_1_IBT) (GNU_PROPERTY_X86_FEATURE_1_SHSTK): New x86 feature bits. gold/ PR gold/22914 * layout.cc (Layout::Layout): Initialize gnu_properties_. (read_sized_value, write_sized_value): New functions. (Layout::layout_gnu_property): New method. (Layout::create_notes): Call create_gnu_properties_note. (Layout::create_gnu_properties_note): New method. * layout.h (Layout::layout_gnu_property): New method. (Layout::create_gnu_properties_note): New method. (Layout::Gnu_property, Layout::Gnu_properties): New types. (Layout::gnu_properties_): New data member. * object.cc (Sized_relobj_file::layout_gnu_property_section): New method. (Sized_relobj_file::do_layout): Handle .note.gnu.property sections. * object.h (Sized_relobj_file::layout_gnu_property_section): New method. * target.h (Target::merge_gnu_property): New method. (Target::do_merge_gnu_property): New virtual method. * x86_64.cc (Target_x86_64::do_merge_gnu_property): New method. * testsuite/Makefile.am (gnu_property_test): New test case. * testsuite/Makefile.in: Regenerate. * testsuite/gnu_property_a.S: New source file. * testsuite/gnu_property_b.S: New source file. * testsuite/gnu_property_c.S: New source file. * testsuite/gnu_property_main.c: New source file. * testsuite/gnu_property_test.sh: New test script.
This commit is contained in:
@@ -693,6 +693,14 @@ class Layout
|
||||
layout_gnu_stack(bool seen_gnu_stack, uint64_t gnu_stack_flags,
|
||||
const Object*);
|
||||
|
||||
// Layout a .note.gnu.property section.
|
||||
void
|
||||
layout_gnu_property(unsigned int note_type,
|
||||
unsigned int pr_type,
|
||||
size_t pr_datasz,
|
||||
const unsigned char* pr_data,
|
||||
const Object* object);
|
||||
|
||||
// Add an Output_section_data to the layout. This is used for
|
||||
// special sections like the GOT section. ORDER is where the
|
||||
// section should wind up in the output segment. IS_RELRO is true
|
||||
@@ -1061,6 +1069,10 @@ class Layout
|
||||
create_note(const char* name, int note_type, const char* section_name,
|
||||
size_t descsz, bool allocate, size_t* trailing_padding);
|
||||
|
||||
// Create a note section for gnu program properties.
|
||||
void
|
||||
create_gnu_properties_note();
|
||||
|
||||
// Create a note section for gold version.
|
||||
void
|
||||
create_gold_note();
|
||||
@@ -1347,6 +1359,14 @@ class Layout
|
||||
std::vector<Section_info> section_infos_;
|
||||
};
|
||||
|
||||
// Program properties from .note.gnu.properties sections.
|
||||
struct Gnu_property
|
||||
{
|
||||
size_t pr_datasz;
|
||||
unsigned char* pr_data;
|
||||
};
|
||||
typedef std::map<unsigned int, Gnu_property> Gnu_properties;
|
||||
|
||||
// The number of input files, for sizing tables.
|
||||
int number_of_input_files_;
|
||||
// Information set by scripts or by command line options.
|
||||
@@ -1473,6 +1493,8 @@ class Layout
|
||||
Incremental_binary* incremental_base_;
|
||||
// For incremental links, a list of free space within the file.
|
||||
Free_list free_list_;
|
||||
// Program properties.
|
||||
Gnu_properties gnu_properties_;
|
||||
};
|
||||
|
||||
// This task handles writing out data in output sections which is not
|
||||
|
||||
Reference in New Issue
Block a user