From 9d09ce14b4eef2b56f24660fd69a44acd45128b2 Mon Sep 17 00:00:00 2001 From: Cupertino Miranda Date: Fri, 2 Mar 2018 17:38:14 +0100 Subject: [PATCH] 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 * elf32-arc.c (elf_arc_check_relocs): Changed. Signed-off-by: Cupertino Miranda Signed-off-by: Alexey Brodkin [Romain: rebase on top of 2.31] Signed-off-by: Romain Naour Upstream-Status: Pending --- bfd/elf32-arc.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/bfd/elf32-arc.c b/bfd/elf32-arc.c index 33fc72cff6e..9b72c5b4f4f 100644 --- a/bfd/elf32-arc.c +++ b/bfd/elf32-arc.c @@ -1960,7 +1960,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) -- 2.14.4