ld: Always call elf_backend_output_arch_local_syms

Always call elf_backend_output_arch_local_syms since only the backend
knows if elf_backend_output_arch_local_syms is needed when all symbols
are striped.  elf_backend_output_arch_local_syms is defined only for
x86, ARM and AARCH64.  On x86, elf_backend_output_arch_local_syms must
be called to handle local IFUNC symbols even if all symbols are striped.
Update ARM and AARCH64 to skip elf_backend_output_arch_local_syms when
symbols aren't needed.

bfd/

	PR ld/29797
	* elf32-arm.c (elf32_arm_output_arch_local_syms): Skip if symbols
	aren't needed.
	* elfnn-aarch64.c (elfNN_aarch64_output_arch_local_syms):
	Likewise.
	* elflink.c (bfd_elf_final_link): Always call
	elf_backend_output_arch_local_syms if available.

ld/

	PR ld/29797
	* testsuite/ld-elf/linux-x86.exp: Run PR ld/29797 test.
	* testsuite/ld-elf/pr29797.c: New file.
This commit is contained in:
H.J. Lu
2022-11-16 15:06:37 -08:00
parent cbda14deaf
commit 25d17459e3
5 changed files with 47 additions and 2 deletions

View File

@ -12877,8 +12877,7 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
/* If backend needs to output some local symbols not present in the hash
table, do it now. */
if (bed->elf_backend_output_arch_local_syms
&& (info->strip != strip_all || emit_relocs))
if (bed->elf_backend_output_arch_local_syms)
{
if (! ((*bed->elf_backend_output_arch_local_syms)
(abfd, info, &flinfo, elf_link_output_symstrtab)))