aboutsummaryrefslogtreecommitdiff
path: root/gold/x86_64.cc
diff options
context:
space:
mode:
authorCary Coutant <ccoutant@gmail.com>2018-06-22 09:27:39 -0700
committerCary Coutant <ccoutant@gmail.com>2018-06-22 09:52:00 -0700
commit6c04fd9b2fb4396c0189cb414ce598161ac8673e (patch)
tree8b3630b03edb8d663a592b472cae1292aad05e7c /gold/x86_64.cc
parent8e7767e3f782c46451a548d708f5582669d7a6d7 (diff)
downloadgdb-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.cc39
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.