]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
aarch64: set sh_entsize of .plt to 0
authorSzabolcs Nagy <szabolcs.nagy@arm.com>
Wed, 29 Jul 2020 14:47:50 +0000 (15:47 +0100)
committerSzabolcs Nagy <szabolcs.nagy@arm.com>
Thu, 30 Jul 2020 16:41:29 +0000 (17:41 +0100)
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.

(cherry picked from commit 4d3bb35620e70d543d438bf21be1307f7ea0f5d0)

bfd/ChangeLog
bfd/elfnn-aarch64.c

index 65d9aa70876fb8269b92cb6e06d5fce41459e06a..3121a090a97970e90b09252a829aebea52260fbf 100644 (file)
@@ -1,3 +1,10 @@
+2020-07-30  Szabolcs Nagy  <szabolcs.nagy@arm.com>
+
+       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-24  Nick Clifton  <nickc@redhat.com>
 
        * version.m4: Set to 2.35.0
index 8f1e5e1e456abbfa8b8eb9ae219d76f1f49c0cab..312d11b4ff9cd579c4bd0ad62d41ae3bd108a250 100644 (file)
@@ -9512,8 +9512,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
@@ -9615,10 +9618,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);