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:
parent
cbda14deaf
commit
25d17459e3
5 changed files with 47 additions and 2 deletions
|
@ -18110,6 +18110,11 @@ elf32_arm_output_arch_local_syms (bfd *output_bfd,
|
|||
bfd_size_type size;
|
||||
bfd *input_bfd;
|
||||
|
||||
if (info->strip == strip_all
|
||||
&& !info->emitrelocations
|
||||
&& !bfd_link_relocatable (info))
|
||||
return true;
|
||||
|
||||
htab = elf32_arm_hash_table (info);
|
||||
if (htab == NULL)
|
||||
return false;
|
||||
|
|
|
@ -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)))
|
||||
|
|
|
@ -8476,6 +8476,11 @@ elfNN_aarch64_output_arch_local_syms (bfd *output_bfd,
|
|||
output_arch_syminfo osi;
|
||||
struct elf_aarch64_link_hash_table *htab;
|
||||
|
||||
if (info->strip == strip_all
|
||||
&& !info->emitrelocations
|
||||
&& !bfd_link_relocatable (info))
|
||||
return true;
|
||||
|
||||
htab = elf_aarch64_hash_table (info);
|
||||
|
||||
osi.finfo = finfo;
|
||||
|
|
|
@ -203,6 +203,21 @@ run_ld_link_exec_tests [list \
|
|||
] \
|
||||
]
|
||||
|
||||
# Run-time tests which require working ifunc attribute support.
|
||||
if { [check_ifunc_attribute_available] } {
|
||||
run_ld_link_exec_tests [list \
|
||||
[list \
|
||||
"Run pr29797" \
|
||||
"-s" \
|
||||
"" \
|
||||
{ pr29797.c } \
|
||||
"pr29797" \
|
||||
"pass.out" \
|
||||
"-O0" \
|
||||
] \
|
||||
]
|
||||
}
|
||||
|
||||
# Old gcc silently ignores __attribute__ ((aligned())) with too big alignment.
|
||||
proc compiler_honours_aligned { } {
|
||||
global CC_FOR_TARGET READELF srcdir subdir
|
||||
|
|
21
ld/testsuite/ld-elf/pr29797.c
Normal file
21
ld/testsuite/ld-elf/pr29797.c
Normal file
|
@ -0,0 +1,21 @@
|
|||
#include <stdio.h>
|
||||
|
||||
static int foo (int x) __attribute__ ((ifunc ("resolve_foo")));
|
||||
|
||||
static int foo_impl(int x)
|
||||
{
|
||||
return x;
|
||||
}
|
||||
|
||||
static void *resolve_foo (void)
|
||||
{
|
||||
return (void *) foo_impl;
|
||||
}
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
foo (0);
|
||||
puts ("PASS");
|
||||
return 0;
|
||||
}
|
Loading…
Add table
Reference in a new issue