cae1fbbb7e
elf_XXX_reloc_type_class should return reloc_class_ifunc for relocation against STT_GNU_IFUNC symbol. bfd/ PR ld/18841 * elf-bfd.h (elf_link_hash_table): Add dynsym. * elf32-i386.c (elf_i386_reloc_type_class): Return reloc_class_ifunc for relocation against STT_GNU_IFUNC symbol. * elf64-x86-64.c (elf_x86_64_reloc_type_class): Likewise. * elflink.c (_bfd_elf_link_create_dynamic_sections): Set dynsym. (bfd_elf_size_dynsym_hash_dynstr): Use dynsym. (elf_final_link_info): Remove dynsym_sec. (elf_link_output_extsym): Replace dynsym_sec with dynsym. (bfd_elf_final_link): Remove reference to dynsym_sec. Replace dynsym_sec with dynsym. ld/testsuite/ PR ld/18841 * ld-ifunc/ifunc.exp: Add a test for PR ld/18841. * ld-ifunc/pr18841.out: New file. * ld-ifunc/pr18841a.c: Likewise. * ld-ifunc/pr18841b.c: Likewise.
22 lines
301 B
C
22 lines
301 B
C
void foo() __attribute__((ifunc("resolve_foo")));
|
|
|
|
static void foo_impl() {}
|
|
|
|
extern void abort (void);
|
|
void test()
|
|
{
|
|
void (*pg)(void) = foo;
|
|
if (pg != foo_impl)
|
|
abort ();
|
|
pg();
|
|
}
|
|
|
|
static void* resolve_foo()
|
|
{
|
|
extern void zoo(void);
|
|
|
|
void (*pz)(void) = zoo;
|
|
pz();
|
|
return foo_impl;
|
|
}
|