Fix elf_x86_64_reloc_type_class
This commit is contained in:
parent
28215275a6
commit
897463b12b
@ -6001,21 +6001,27 @@ elf_x86_64_reloc_type_class (const struct bfd_link_info *info,
|
|||||||
const struct elf_backend_data *bed = get_elf_backend_data (abfd);
|
const struct elf_backend_data *bed = get_elf_backend_data (abfd);
|
||||||
struct elf_x86_64_link_hash_table *htab = elf_x86_64_hash_table (info);
|
struct elf_x86_64_link_hash_table *htab = elf_x86_64_hash_table (info);
|
||||||
|
|
||||||
|
if ((int) ELF32_R_TYPE (rela->r_info) == R_X86_64_IRELATIVE)
|
||||||
|
return reloc_class_ifunc;
|
||||||
|
|
||||||
if (htab->elf.dynsym != NULL
|
if (htab->elf.dynsym != NULL
|
||||||
&& htab->elf.dynsym->contents != NULL)
|
&& htab->elf.dynsym->contents != NULL)
|
||||||
{
|
{
|
||||||
/* Check relocation against STT_GNU_IFUNC symbol if there are
|
/* Check relocation against STT_GNU_IFUNC symbol if there are
|
||||||
dynamic symbols. */
|
dynamic symbols. */
|
||||||
unsigned long r_symndx = htab->r_sym (rela->r_info);
|
unsigned long r_symndx = htab->r_sym (rela->r_info);
|
||||||
Elf_Internal_Sym sym;
|
if (r_symndx != STN_UNDEF)
|
||||||
if (!bed->s->swap_symbol_in (abfd,
|
{
|
||||||
(htab->elf.dynsym->contents
|
Elf_Internal_Sym sym;
|
||||||
+ r_symndx * bed->s->sizeof_sym),
|
if (!bed->s->swap_symbol_in (abfd,
|
||||||
0, &sym))
|
(htab->elf.dynsym->contents
|
||||||
abort ();
|
+ r_symndx * bed->s->sizeof_sym),
|
||||||
|
0, &sym))
|
||||||
|
abort ();
|
||||||
|
|
||||||
if (ELF_ST_TYPE (sym.st_info) == STT_GNU_IFUNC)
|
if (ELF_ST_TYPE (sym.st_info) == STT_GNU_IFUNC)
|
||||||
return reloc_class_ifunc;
|
return reloc_class_ifunc;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ((int) ELF32_R_TYPE (rela->r_info))
|
switch ((int) ELF32_R_TYPE (rela->r_info))
|
||||||
|
Loading…
Reference in New Issue
Block a user