aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf64-alpha.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2005-05-25 20:00:40 +0000
committerRichard Henderson <rth@redhat.com>2005-05-25 20:00:40 +0000
commit308da68f566ce4c336ac0207fa22b64074d6bb89 (patch)
tree266001747686e01442e4165cff301a9d5c5ad7dc /bfd/elf64-alpha.c
parent1dc3053feacd491f2cf67e53c9c9fe0a9bed7825 (diff)
downloadfsf-binutils-gdb-308da68f566ce4c336ac0207fa22b64074d6bb89.zip
fsf-binutils-gdb-308da68f566ce4c336ac0207fa22b64074d6bb89.tar.gz
fsf-binutils-gdb-308da68f566ce4c336ac0207fa22b64074d6bb89.tar.bz2
* elf64-alpha.c (elf64_alpha_merge_gots): Fix gotent iteration
in the presence of deleting elements. (elf64_alpha_size_got_sections): Zero dead got section size.
Diffstat (limited to 'bfd/elf64-alpha.c')
-rw-r--r--bfd/elf64-alpha.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/bfd/elf64-alpha.c b/bfd/elf64-alpha.c
index 5a5c736..e13f260 100644
--- a/bfd/elf64-alpha.c
+++ b/bfd/elf64-alpha.c
@@ -3523,16 +3523,17 @@ elf64_alpha_merge_gots (a, b)
|| h->root.root.type == bfd_link_hash_warning)
h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
- start = &h->got_entries;
- for (pbe = start, be = *start; be ; pbe = &be->next, be = be->next)
+ pbe = start = &h->got_entries;
+ while ((be = *pbe) != NULL)
{
if (be->use_count == 0)
{
*pbe = be->next;
- continue;
+ memset (be, 0xa5, sizeof (*be));
+ goto kill;
}
if (be->gotobj != b)
- continue;
+ goto next;
for (ae = *start; ae ; ae = ae->next)
if (ae->gotobj == a
@@ -3542,12 +3543,15 @@ elf64_alpha_merge_gots (a, b)
ae->flags |= be->flags;
ae->use_count += be->use_count;
*pbe = be->next;
- goto global_found;
+ memset (be, 0xa5, sizeof (*be));
+ goto kill;
}
be->gotobj = a;
total += alpha_got_entry_size (be->reloc_type);
- global_found:;
+ next:;
+ pbe = &be->next;
+ kill:;
}
}
@@ -3703,8 +3707,11 @@ elf64_alpha_size_got_sections (info)
if (elf64_alpha_can_merge_gots (cur_got_obj, i))
{
elf64_alpha_merge_gots (cur_got_obj, i);
+
+ alpha_elf_tdata(i)->got->size = 0;
i = alpha_elf_tdata(i)->got_link_next;
alpha_elf_tdata(cur_got_obj)->got_link_next = i;
+
something_changed = 1;
}
else