Check R_*_IRELATIVE in x86 reloc_type_class
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 14 Jun 2016 17:18:26 +0000 (10:18 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 14 Jun 2016 17:18:26 +0000 (10:18 -0700)
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.

bfd/ChangeLog
bfd/elf32-i386.c
bfd/elf64-x86-64.c

index 7e64f86ec08e6e38184d98ca26294f6326f3c470..f88e18582f27bdb0cb4b8d6fac7f4082092fbaf8 100644 (file)
@@ -1,3 +1,11 @@
+2016-06-14  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * 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.
+
 2016-06-14  Thomas Preud'homme  <thomas.preudhomme@arm.com>
 
        * elf32-arm.c (using_thumb_only): Force review of arch check logic for
index a68ce1fc1862556c5e4a84cfe285c7f040d6879b..686c0682fb0e0f666b2a108e65173b50887cd8d7 100644 (file)
@@ -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:
index f8a7ca39e669f61d267ca122707dbec377faeba0..b2096044a10175d944aa51c7229dee5838d3df4f 100644 (file)
@@ -6001,9 +6001,6 @@ elf_x86_64_reloc_type_class (const struct bfd_link_info *info,
   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);
 
-  if ((int) ELF32_R_TYPE (rela->r_info) == R_X86_64_IRELATIVE)
-    return reloc_class_ifunc;
-
   if (htab->elf.dynsym != NULL
       && htab->elf.dynsym->contents != NULL)
     {
@@ -6026,6 +6023,8 @@ elf_x86_64_reloc_type_class (const struct bfd_link_info *info,
 
   switch ((int) ELF32_R_TYPE (rela->r_info))
     {
+    case R_X86_64_IRELATIVE:
+      return reloc_class_ifunc;
     case R_X86_64_RELATIVE:
     case R_X86_64_RELATIVE64:
       return reloc_class_relative;