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.
This commit is contained in:
Szabolcs Nagy 2020-07-29 15:47:50 +01:00
parent e12dcc50da
commit 4d3bb35620
2 changed files with 12 additions and 6 deletions

View 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-30 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> 2020-07-30 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* bfd.m4 (BFD_SYS_PROCFS_H): New macro. * bfd.m4 (BFD_SYS_PROCFS_H): New macro.

View File

@ -9509,8 +9509,11 @@ elfNN_aarch64_init_small_plt0_entry (bfd *output_bfd ATTRIBUTE_UNUSED,
memcpy (htab->root.splt->contents, htab->plt0_entry, memcpy (htab->root.splt->contents, htab->plt0_entry,
htab->plt_header_size); 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 plt_got_2nd_ent = (htab->root.sgotplt->output_section->vma
+ htab->root.sgotplt->output_offset + 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); 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)) if (htab->root.tlsdesc_plt && !(info->flags & DF_BIND_NOW))
{ {
BFD_ASSERT (htab->root.tlsdesc_got != (bfd_vma)-1); BFD_ASSERT (htab->root.tlsdesc_got != (bfd_vma)-1);