diff options
Diffstat (limited to 'bfd/elf32-m32r.c')
-rw-r--r-- | bfd/elf32-m32r.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/bfd/elf32-m32r.c b/bfd/elf32-m32r.c index fd67e05..651e6d5 100644 --- a/bfd/elf32-m32r.c +++ b/bfd/elf32-m32r.c @@ -1526,8 +1526,8 @@ struct elf_m32r_link_hash_table asection *sdynbss; asection *srelbss; - /* Small local sym to section mapping cache. */ - struct sym_sec_cache sym_sec; + /* Small local sym cache. */ + struct sym_cache sym_cache; }; /* Traverse an m32r ELF linker hash table. */ @@ -1604,7 +1604,7 @@ m32r_elf_link_hash_table_create (bfd *abfd) ret->srelplt = NULL; ret->sdynbss = NULL; ret->srelbss = NULL; - ret->sym_sec.abfd = NULL; + ret->sym_cache.abfd = NULL; return &ret->root.root; } @@ -3941,14 +3941,19 @@ m32r_elf_check_relocs (bfd *abfd, head = &((struct elf_m32r_link_hash_entry *) h)->dyn_relocs; else { + /* Track dynamic relocs needed for local syms too. */ asection *s; void *vpp; + Elf_Internal_Sym *isym; - /* Track dynamic relocs needed for local syms too. */ - s = bfd_section_from_r_symndx (abfd, &htab->sym_sec, - sec, r_symndx); - if (s == NULL) - return FALSE; + isym = bfd_sym_from_r_symndx (&htab->sym_cache, + abfd, r_symndx); + if (isym == NULL) + return FALSE; + + s = bfd_section_from_elf_index (abfd, isym->st_shndx); + if (s == NULL) + s = sec; vpp = &elf_section_data (s)->local_dynrel; head = (struct elf_m32r_dyn_relocs **) vpp; |