From: Szabolcs Nagy Date: Wed, 29 Jul 2020 14:47:50 +0000 (+0100) Subject: aarch64: set sh_entsize of .plt to 0 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4d3bb35620e70d543d438bf21be1307f7ea0f5d0;p=binutils-gdb.git aarch64: set sh_entsize of .plt to 0 On aarch64 the first PLT entry is 32 bytes, subsequent entries are 16 bytes by default but can be 24 bytes with BTI or with PAC-PLT. sh_entsize of .plt was set to the PLT entry size, so in some cases sh_size % sh_entsize != 0, which breaks some tools. Note that PLT0 (and the TLSDESC stub code which is also in the PLT) were historically not padded up to meet the sh_size requirement, but to ensure that PLT stub code is aligned on cache lines. Similar layout is present on other targets too which just happens to make sh_size a multiple of sh_entsize and it is not expected that sh_entsize of .plt is used for anything. This patch sets sh_entsize of .plt to 0: the section does not hold a table of fixed-size entries so other values are not conforming in principle to the ELF spec. bfd/ChangeLog: PR ld/26312 * elfnn-aarch64.c (elfNN_aarch64_init_small_plt0_entry): Set sh_entsize to 0. (elfNN_aarch64_finish_dynamic_sections): Remove sh_entsize setting. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 264e15a1fe5..e507a9d6c0f 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2020-07-30 Szabolcs Nagy + + PR ld/26312 + * elfnn-aarch64.c (elfNN_aarch64_init_small_plt0_entry): Set sh_entsize + to 0. + (elfNN_aarch64_finish_dynamic_sections): Remove sh_entsize setting. + 2020-07-30 Rainer Orth * bfd.m4 (BFD_SYS_PROCFS_H): New macro. diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index 2c88f288c3a..a1c88872278 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -9509,8 +9509,11 @@ elfNN_aarch64_init_small_plt0_entry (bfd *output_bfd ATTRIBUTE_UNUSED, memcpy (htab->root.splt->contents, htab->plt0_entry, htab->plt_header_size); - elf_section_data (htab->root.splt->output_section)->this_hdr.sh_entsize = - htab->plt_header_size; + + /* PR 26312: Explicitly set the sh_entsize to 0 so that + consumers do not think that the section contains fixed + sized objects. */ + elf_section_data (htab->root.splt->output_section)->this_hdr.sh_entsize = 0; plt_got_2nd_ent = (htab->root.sgotplt->output_section->vma + htab->root.sgotplt->output_offset @@ -9612,10 +9615,6 @@ elfNN_aarch64_finish_dynamic_sections (bfd *output_bfd, { elfNN_aarch64_init_small_plt0_entry (output_bfd, htab); - elf_section_data (htab->root.splt->output_section)-> - this_hdr.sh_entsize = htab->plt_entry_size; - - if (htab->root.tlsdesc_plt && !(info->flags & DF_BIND_NOW)) { BFD_ASSERT (htab->root.tlsdesc_got != (bfd_vma)-1);