aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCupertino Miranda <cmiranda@synopsys.com>2018-03-02 17:38:14 +0100
committerCupertino Miranda <cmiranda@synopsys.com>2018-10-01 12:42:11 +0100
commit2936af90155cf7f7647b4886dc5b9568d15ca298 (patch)
tree624b5990ec361469325a2ae22f73c031c51e0571
parentc834917fda58d9e4cd72b67f7793e2f429ccce57 (diff)
downloadgdb-2936af90155cf7f7647b4886dc5b9568d15ca298.zip
gdb-2936af90155cf7f7647b4886dc5b9568d15ca298.tar.gz
gdb-2936af90155cf7f7647b4886dc5b9568d15ca298.tar.bz2
[ARC] Make sure global symbol is not an indirect or warning.
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.
-rw-r--r--bfd/elf32-arc.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/bfd/elf32-arc.c b/bfd/elf32-arc.c
index 3f60d09..4d36a41 100644
--- a/bfd/elf32-arc.c
+++ b/bfd/elf32-arc.c
@@ -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)