[AArch64] Fix PR18841 ifunc relocation ordering

In order to get the ifunc relocs properly sorted the correct class
needs to be returned.  The code mimics what has been done for x86.

Fixes
FAIL: Run pr18841 with libpr18841c.so

bfd/
	PR ld/18841
	* elfnn-aarch64.c (elfNN_aarch64_reloc_type_class): Return
	reloc_class_ifunc for ifunc symbols.
This commit is contained in:
Szabolcs Nagy 2017-07-04 15:43:59 +01:00
parent 6c4e7b6bfb
commit f2e6a8430e
2 changed files with 37 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2017-07-19 Szabolcs Nagy <szabolcs.nagy@arm.com>
PR ld/18841
* elfnn-aarch64.c (elfNN_aarch64_reloc_type_class): Return
reloc_class_ifunc for ifunc symbols.
2017-07-19 Nick Clifton <nickc@redhat.com>
PR 21787

View File

@ -7634,8 +7634,39 @@ elfNN_aarch64_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSE
const asection *rel_sec ATTRIBUTE_UNUSED,
const Elf_Internal_Rela *rela)
{
struct elf_aarch64_link_hash_table *htab = elf_aarch64_hash_table (info);
if (htab->root.dynsym != NULL
&& htab->root.dynsym->contents != NULL)
{
/* Check relocation against STT_GNU_IFUNC symbol if there are
dynamic symbols. */
bfd *abfd = info->output_bfd;
const struct elf_backend_data *bed = get_elf_backend_data (abfd);
unsigned long r_symndx = ELFNN_R_SYM (rela->r_info);
if (r_symndx != STN_UNDEF)
{
Elf_Internal_Sym sym;
if (!bed->s->swap_symbol_in (abfd,
(htab->root.dynsym->contents
+ r_symndx * bed->s->sizeof_sym),
0, &sym))
{
/* xgettext:c-format */
_bfd_error_handler (_("%B symbol number %lu references"
" nonexistent SHT_SYMTAB_SHNDX section"),
abfd, r_symndx);
/* Ideally an error class should be returned here. */
}
else if (ELF_ST_TYPE (sym.st_info) == STT_GNU_IFUNC)
return reloc_class_ifunc;
}
}
switch ((int) ELFNN_R_TYPE (rela->r_info))
{
case AARCH64_R (IRELATIVE):
return reloc_class_ifunc;
case AARCH64_R (RELATIVE):
return reloc_class_relative;
case AARCH64_R (JUMP_SLOT):