diff options
author | Richard Henderson <rth@redhat.com> | 2005-05-25 20:00:40 +0000 |
---|---|---|
committer | Richard Henderson <rth@redhat.com> | 2005-05-25 20:00:40 +0000 |
commit | 308da68f566ce4c336ac0207fa22b64074d6bb89 (patch) | |
tree | 266001747686e01442e4165cff301a9d5c5ad7dc /bfd/elf64-alpha.c | |
parent | 1dc3053feacd491f2cf67e53c9c9fe0a9bed7825 (diff) | |
download | gdb-308da68f566ce4c336ac0207fa22b64074d6bb89.zip gdb-308da68f566ce4c336ac0207fa22b64074d6bb89.tar.gz 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.c | 19 |
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 |