summaryrefslogtreecommitdiff
path: root/bfd/coff-x86_64.c
diff options
context:
space:
mode:
Diffstat (limited to 'bfd/coff-x86_64.c')
-rw-r--r--bfd/coff-x86_64.c33
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;