[ARC] Make sure global symbol is not an indirect or warning.
authorCupertino Miranda <cmiranda@synopsys.com>
Fri, 2 Mar 2018 16:38:14 +0000 (17:38 +0100)
committerCupertino Miranda <cmiranda@synopsys.com>
Mon, 1 Oct 2018 11:42:11 +0000 (12:42 +0100)
Problem identified in the context of glibc with latest upstream binutils.
Dynamic symbol space was being reserved but, no actual information for the
symbol was being set. Data for the symbol was kept initialized with -1.
No easy test case was possible to be created.

bfd/
2018-03-01  Cupertino Miranda <cmiranda@synopsys.com>

* elf32-arc.c (elf_arc_check_relocs): Changed.

bfd/elf32-arc.c

index 3f60d097e62bab5781766fa2adc4f79dd4d0b830..4d36a4175610d887f85bd401e4bfd1fc1ce0c924 100644 (file)
@@ -1976,7 +1976,12 @@ elf_arc_check_relocs (bfd *                       abfd,
       if (r_symndx < symtab_hdr->sh_info) /* Is a local symbol.  */
        h = NULL;
       else /* Global one.  */
-       h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+       {
+         h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+         while (h->root.type == bfd_link_hash_indirect
+                || h->root.type == bfd_link_hash_warning)
+           h = (struct elf_link_hash_entry *) h->root.u.i.link;
+       }
 
 
       switch (r_type)