X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Felfxx-aarch64.c;h=1495ade7550d9ebd746378ef18035aeae8064716;hb=refs%2Fheads%2Fconcurrent-displaced-stepping-2020-04-01;hp=040814097f98071db09564392ed972e2e9f29692;hpb=acde6c6b431a8c38ab18a47bb56f65f515448195;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elfxx-aarch64.c b/bfd/elfxx-aarch64.c index 040814097f..1495ade755 100644 --- a/bfd/elfxx-aarch64.c +++ b/bfd/elfxx-aarch64.c @@ -1,5 +1,5 @@ /* AArch64-specific support for ELF. - Copyright (C) 2009-2019 Free Software Foundation, Inc. + Copyright (C) 2009-2020 Free Software Foundation, Inc. Contributed by ARM Ltd. This file is part of BFD, the Binary File Descriptor library. @@ -395,10 +395,12 @@ _bfd_aarch64_elf_put_addend (bfd *abfd, } bfd_vma -_bfd_aarch64_elf_resolve_relocation (bfd_reloc_code_real_type r_type, +_bfd_aarch64_elf_resolve_relocation (bfd *input_bfd, + bfd_reloc_code_real_type r_type, bfd_vma place, bfd_vma value, bfd_vma addend, bfd_boolean weak_undef_p) { + bfd_boolean tls_reloc = TRUE; switch (r_type) { case BFD_RELOC_AARCH64_NONE: @@ -446,6 +448,8 @@ _bfd_aarch64_elf_resolve_relocation (bfd_reloc_code_real_type r_type, case BFD_RELOC_AARCH64_MOVW_G2_NC: case BFD_RELOC_AARCH64_MOVW_G2_S: case BFD_RELOC_AARCH64_MOVW_G3: + tls_reloc = FALSE; + /* fall-through. */ case BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC: case BFD_RELOC_AARCH64_TLSDESC_OFF_G1: case BFD_RELOC_AARCH64_TLSGD_MOVW_G0_NC: @@ -466,6 +470,15 @@ _bfd_aarch64_elf_resolve_relocation (bfd_reloc_code_real_type r_type, case BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12: case BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12: case BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12: + /* Weak Symbols and TLS relocations are implementation defined. For this + case we choose to emit 0. */ + if (weak_undef_p && tls_reloc) + { + _bfd_error_handler (_("%pB: warning: Weak TLS is implementation " + "defined and may not work as expected"), + input_bfd); + value = place; + } value = value + addend; break; @@ -695,6 +708,7 @@ _bfd_aarch64_elf_link_setup_gnu_properties (struct bfd_link_info *info, bfd *pbfd; bfd *ebfd = NULL; elf_property *prop; + unsigned align; uint32_t gnu_prop = *gprop; @@ -719,6 +733,11 @@ _bfd_aarch64_elf_link_setup_gnu_properties (struct bfd_link_info *info, prop = _bfd_elf_get_property (ebfd, GNU_PROPERTY_AARCH64_FEATURE_1_AND, 4); + if (gnu_prop & GNU_PROPERTY_AARCH64_FEATURE_1_BTI + && !(prop->u.number & GNU_PROPERTY_AARCH64_FEATURE_1_BTI)) + _bfd_error_handler (_("%pB: warning: BTI turned on by -z force-bti " + "when all inputs do not have BTI in NOTE " + "section."), ebfd); prop->u.number |= gnu_prop; prop->pr_kind = property_number; @@ -738,6 +757,11 @@ _bfd_aarch64_elf_link_setup_gnu_properties (struct bfd_link_info *info, info->callbacks->einfo ( _("%F%P: failed to create GNU property section\n")); + align = (bfd_get_mach (ebfd) & bfd_mach_aarch64_ilp32) ? 2 : 3; + if (!bfd_set_section_alignment (sec, align)) + info->callbacks->einfo (_("%F%pA: failed to align section\n"), + sec); + elf_section_type (sec) = SHT_NOTE; } }