diff options
author | Cary Coutant <ccoutant@gmail.com> | 2018-06-22 09:27:39 -0700 |
---|---|---|
committer | Cary Coutant <ccoutant@gmail.com> | 2018-06-22 09:52:00 -0700 |
commit | 6c04fd9b2fb4396c0189cb414ce598161ac8673e (patch) | |
tree | 8b3630b03edb8d663a592b472cae1292aad05e7c /gold/x86_64.cc | |
parent | 8e7767e3f782c46451a548d708f5582669d7a6d7 (diff) | |
download | gdb-6c04fd9b2fb4396c0189cb414ce598161ac8673e.zip gdb-6c04fd9b2fb4396c0189cb414ce598161ac8673e.tar.gz gdb-6c04fd9b2fb4396c0189cb414ce598161ac8673e.tar.bz2 |
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.
Diffstat (limited to 'gold/x86_64.cc')
-rw-r--r-- | gold/x86_64.cc | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/gold/x86_64.cc b/gold/x86_64.cc index 603ac30..e6fa47e 100644 --- a/gold/x86_64.cc +++ b/gold/x86_64.cc @@ -1188,6 +1188,12 @@ class Target_x86_64 : public Sized_target<size, false> this->rela_dyn_section(layout)); } + // Merge a target-specific program property in the .note.gnu.properties + // section. + void + do_merge_gnu_property(int, int, size_t, const unsigned char*, + size_t, unsigned char*, const Object*) const; + // Information about this specific target which we pass to the // general Target structure. static const Target::Target_info x86_64_info; @@ -1433,6 +1439,39 @@ Target_x86_64<size>::rela_irelative_section(Layout* layout) return this->rela_irelative_; } +// Merge a target-specific program property in the .note.gnu.properties +// section. +template<int size> +void +Target_x86_64<size>::do_merge_gnu_property( + int, 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*) const +{ + size_t min_datasz = (new_pr_datasz > old_pr_datasz + ? old_pr_datasz + : new_pr_datasz); + switch (pr_type) + { + case elfcpp::GNU_PROPERTY_X86_ISA_1_USED: + case elfcpp::GNU_PROPERTY_X86_ISA_1_NEEDED: + { + for (size_t i = 0; i < min_datasz; ++i) + old_pr_data[i] |= new_pr_data[i]; + } + break; + case elfcpp::GNU_PROPERTY_X86_FEATURE_1_AND: + { + for (size_t i = 0; i < min_datasz; ++i) + old_pr_data[i] &= new_pr_data[i]; + } + break; + default: + break; + } +} + // Write the first three reserved words of the .got.plt section. // The remainder of the section is written while writing the PLT // in Output_data_plt_i386::do_write. |