[PATCH] aarch64: set sh_entsize of .plt to 0

Szabolcs Nagy szabolcs.nagy@arm.com
Thu Jul 30 12:17:52 GMT 2020

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

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.


	PR ld/26312
	* elfnn-aarch64.c (elfNN_aarch64_init_small_plt0_entry): Don't set
	(elfNN_aarch64_finish_dynamic_sections): Likewise.
 bfd/elfnn-aarch64.c | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c
index 8f1e5e1e45..455f8099e9 100644
--- a/bfd/elfnn-aarch64.c
+++ b/bfd/elfnn-aarch64.c
@@ -9512,8 +9512,6 @@ elfNN_aarch64_init_small_plt0_entry (bfd *output_bfd ATTRIBUTE_UNUSED,
   memcpy (htab->root.splt->contents, htab->plt0_entry,
-  elf_section_data (htab->root.splt->output_section)->this_hdr.sh_entsize =
-    htab->plt_header_size;
   plt_got_2nd_ent = (htab->root.sgotplt->output_section->vma
 		  + htab->root.sgotplt->output_offset
@@ -9615,10 +9613,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);

More information about the Binutils mailing list