X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gold%2Fx86_64.cc;h=8b6027e72c309ffa96f8364f4bb112d7b4c35e84;hb=bb82aefe17866cdcb996ae35a3895bb36b4d674b;hp=9b725970f0360d87025ba2559910ddf13c42737c;hpb=750ea5ed38abbda8a6f25e276bff3dfc8e4ce0ee;p=deliverable%2Fbinutils-gdb.git diff --git a/gold/x86_64.cc b/gold/x86_64.cc index 9b725970f0..8b6027e72c 100644 --- a/gold/x86_64.cc +++ b/gold/x86_64.cc @@ -1,6 +1,6 @@ // x86_64.cc -- x86_64 target support for gold. -// Copyright (C) 2006-2018 Free Software Foundation, Inc. +// Copyright (C) 2006-2020 Free Software Foundation, Inc. // Written by Ian Lance Taylor . // This file is part of gold. @@ -706,7 +706,8 @@ class Target_x86_64 : public Sized_target rela_irelative_(NULL), copy_relocs_(elfcpp::R_X86_64_COPY), got_mod_index_offset_(-1U), tlsdesc_reloc_info_(), tls_base_symbol_defined_(false), isa_1_used_(0), isa_1_needed_(0), - feature_1_(0), object_feature_1_(0), seen_first_object_(false) + feature_1_(0), object_isa_1_used_(0), object_feature_1_(0), + seen_first_object_(false) { } // Hook for a new output section. @@ -1307,7 +1308,8 @@ class Target_x86_64 : public Sized_target // Record a target-specific program property in the .note.gnu.property // section. void - record_gnu_property(int, int, size_t, const unsigned char*, const Object*); + record_gnu_property(unsigned int, unsigned int, size_t, + const unsigned char*, const Object*); // Merge the target-specific program properties from the current object. void @@ -1381,6 +1383,11 @@ class Target_x86_64 : public Sized_target uint32_t isa_1_needed_; uint32_t feature_1_; // Target-specific properties from the current object. + // These bits get ORed into ISA_1_USED_ after all properties for the object + // have been processed. But if either is all zeroes (as when the property + // is absent from an object), the result should be all zeroes. + // (See PR ld/23486.) + uint32_t object_isa_1_used_; // These bits get ANDed into FEATURE_1_ after all properties for the object // have been processed. uint32_t object_feature_1_; @@ -1579,11 +1586,11 @@ Target_x86_64::rela_irelative_section(Layout* layout) template void Target_x86_64::record_gnu_property( - int, int pr_type, + unsigned int, unsigned int pr_type, size_t pr_datasz, const unsigned char* pr_data, const Object* object) { - uint32_t val; + uint32_t val = 0; switch (pr_type) { @@ -1609,7 +1616,7 @@ Target_x86_64::record_gnu_property( switch (pr_type) { case elfcpp::GNU_PROPERTY_X86_ISA_1_USED: - this->isa_1_used_ |= val; + this->object_isa_1_used_ |= val; break; case elfcpp::GNU_PROPERTY_X86_ISA_1_NEEDED: this->isa_1_needed_ |= val; @@ -1627,12 +1634,22 @@ void Target_x86_64::merge_gnu_properties(const Object*) { if (this->seen_first_object_) - this->feature_1_ &= this->object_feature_1_; + { + // If any object is missing the ISA_1_USED property, we must omit + // it from the output file. + if (this->object_isa_1_used_ == 0) + this->isa_1_used_ = 0; + else if (this->isa_1_used_ != 0) + this->isa_1_used_ |= this->object_isa_1_used_; + this->feature_1_ &= this->object_feature_1_; + } else { + this->isa_1_used_ = this->object_isa_1_used_; this->feature_1_ = this->object_feature_1_; this->seen_first_object_ = true; } + this->object_isa_1_used_ = 0; this->object_feature_1_ = 0; } @@ -4835,10 +4852,9 @@ Target_x86_64::Relocate::relocate( case elfcpp::R_X86_64_GOTOFF64: { - typename elfcpp::Elf_types::Elf_Addr value; - value = (psymval->value(object, 0) - - target->got_plt_section()->address()); - Reloc_funcs::rela64(view, value, addend); + typename elfcpp::Elf_types::Elf_Addr reladdr; + reladdr = target->got_plt_section()->address(); + Reloc_funcs::pcrela64(view, object, psymval, addend, reladdr); } break;