diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2016-06-14 10:18:26 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2016-06-14 10:18:26 -0700 |
commit | c428ce9d900c4acc4a7ee74791c55676d96f0818 (patch) | |
tree | f77e647801adfd85b194c879826da7ef08fb7ae2 /bfd/elf32-i386.c | |
parent | 897463b12ba936df7d2070755eaac94f87fcedfb (diff) | |
download | gdb-c428ce9d900c4acc4a7ee74791c55676d96f0818.zip gdb-c428ce9d900c4acc4a7ee74791c55676d96f0818.tar.gz gdb-c428ce9d900c4acc4a7ee74791c55676d96f0818.tar.bz2 |
Check R_*_IRELATIVE in x86 reloc_type_class
elf_{i386|x86_64}_reloc_type_class should return reloc_class_ifunc for
R_386_IRELATIVE/R_X86_64_IRELATIVE relocations. There is no need to
check symbol type for STN_UNDEF symbol index.
* elf32-i386.c (elf_i386_reloc_type_class): Check R_386_IRELATIVE.
Don't check symbol type for STN_UNDEF symbol index.
* elf64-x86-64.c (elf_x86_64_reloc_type_class): Check
R_X86_64_IRELATIVE. Don't check symbol type for STN_UNDEF symbol
index.
Diffstat (limited to 'bfd/elf32-i386.c')
-rw-r--r-- | bfd/elf32-i386.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index a68ce1f..686c068 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -5562,19 +5562,24 @@ elf_i386_reloc_type_class (const struct bfd_link_info *info, /* Check relocation against STT_GNU_IFUNC symbol if there are dynamic symbols. */ unsigned long r_symndx = ELF32_R_SYM (rela->r_info); - Elf_Internal_Sym sym; - if (!bed->s->swap_symbol_in (abfd, - (htab->dynsym->contents - + r_symndx * sizeof (Elf32_External_Sym)), - 0, &sym)) - abort (); + if (r_symndx != STN_UNDEF) + { + Elf_Internal_Sym sym; + if (!bed->s->swap_symbol_in (abfd, + (htab->dynsym->contents + + r_symndx * sizeof (Elf32_External_Sym)), + 0, &sym)) + abort (); - if (ELF32_ST_TYPE (sym.st_info) == STT_GNU_IFUNC) - return reloc_class_ifunc; + if (ELF32_ST_TYPE (sym.st_info) == STT_GNU_IFUNC) + return reloc_class_ifunc; + } } switch (ELF32_R_TYPE (rela->r_info)) { + case R_386_IRELATIVE: + return reloc_class_ifunc; case R_386_RELATIVE: return reloc_class_relative; case R_386_JUMP_SLOT: |