From: Richard Henderson Date: Wed, 25 May 2005 20:00:40 +0000 (+0000) Subject: * elf64-alpha.c (elf64_alpha_merge_gots): Fix gotent iteration X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=308da68f566ce4c336ac0207fa22b64074d6bb89;p=binutils-gdb.git * 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. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 8dd00fce5d7..5c3466fb391 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2005-05-25 Richard Henderson + + * 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. + 2005-05-23 Fred Fish * dwarf2.c (struct dwarf2_debug): Add inliner_chain member. diff --git a/bfd/elf64-alpha.c b/bfd/elf64-alpha.c index 5a5c736ad2b..e13f2604e73 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