diff options
Diffstat (limited to 'bfd/coff-x86_64.c')
-rw-r--r-- | bfd/coff-x86_64.c | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/bfd/coff-x86_64.c b/bfd/coff-x86_64.c index 822504a339b..1f8c8d515c4 100644 --- a/bfd/coff-x86_64.c +++ b/bfd/coff-x86_64.c @@ -745,22 +745,37 @@ coff_amd64_rtype_to_howto (bfd *abfd ATTRIBUTE_UNUSED, if (rel->r_type == R_AMD64_SECREL) { - bfd_vma osect_vma; + bfd_vma osect_vma = 0; - if (h && (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak)) + if (h != NULL + && (h->root.type == bfd_link_hash_defined + || h->root.type == bfd_link_hash_defweak)) osect_vma = h->root.u.def.section->output_section->vma; else { + htab_t table = coff_data (abfd)->section_by_index; asection *s; - int i; - /* Sigh, the only way to get the section to offset against - is to find it the hard way. */ - for (s = abfd->sections, i = 1; i < sym->n_scnum; i++) - s = s->next; + if (htab_elements (table) == 0) + { + /* Sigh - if we do not have a section index then the only way + to get the section to offset against is to find it the hard + way. */ + for (s = abfd->sections; s != NULL; s = s->next) + { + void ** slot = htab_find_slot (table, s, INSERT); + + if (slot != NULL) + *slot = s; + } + } + + struct bfd_section needle; - osect_vma = s->output_section->vma; + needle.index = sym->n_scnum - 1; + s = htab_find (table, &needle); + if (s != NULL) + osect_vma = s->output_section->vma; } *addendp -= osect_vma; |