From a9585d22b53bfd23847a70cb13ebdd3e300886ae Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 4 Aug 2009 08:03:35 +0000 Subject: [PATCH] * elf32-ppc.c (ppc_elf_relax_section): Correct conditions under which find_plt_ent is called. Delete redundant code. --- bfd/ChangeLog | 5 ++++ bfd/elf32-ppc.c | 79 ++++++++++++++++++++++++++++++--------------------------- 2 files changed, 46 insertions(+), 38 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 0dc3695..50866fc 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2009-08-04 Alan Modra + + * elf32-ppc.c (ppc_elf_relax_section): Correct conditions under + which find_plt_ent is called. Delete redundant code. + 2009-08-03 H.J. Lu PR binutils/10363 diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index d1baec9..215b4b3 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -5934,6 +5934,7 @@ ppc_elf_relax_section (bfd *abfd, bfd_byte *hit_addr; unsigned long t0; struct elf_link_hash_entry *h; + struct plt_entry **plist; unsigned char sym_type; switch (r_type) @@ -5997,12 +5998,8 @@ ppc_elf_relax_section (bfd *abfd, || h->root.type == bfd_link_hash_warning) h = (struct elf_link_hash_entry *) h->root.u.i.link; - tsec = NULL; - toff = 0; - if (tsec != NULL) - ; - else if (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) + if (h->root.type == bfd_link_hash_defined + || h->root.type == bfd_link_hash_defweak) { tsec = h->root.u.def.section; toff = h->root.u.def.value; @@ -6019,42 +6016,48 @@ ppc_elf_relax_section (bfd *abfd, sym_type = h->type; } - if (is_branch_reloc (r_type)) + /* The condition here under which we call find_plt_ent must + match that in relocate_section. If we call find_plt_ent here + but not in relocate_section, or vice versa, then the branch + destination used here may be incorrect. */ + plist = NULL; + if (h != NULL) { - struct plt_entry **plist = NULL; - - if (h != NULL) + /* We know is_branch_reloc (r_type) is true. */ + if (h->type == STT_GNU_IFUNC + || r_type == R_PPC_PLTREL24) plist = &h->plt.plist; - else if (sym_type == STT_GNU_IFUNC) - { - bfd_vma *local_got_offsets = elf_local_got_offsets (abfd); - struct plt_entry **local_plt = (struct plt_entry **) - (local_got_offsets + symtab_hdr->sh_info); - plist = local_plt + ELF32_R_SYM (irel->r_info); - } - if (plist != NULL) - { - bfd_vma addend = 0; - struct plt_entry *ent; + } + else if (sym_type == STT_GNU_IFUNC + && elf_local_got_offsets (abfd) != NULL) + { + bfd_vma *local_got_offsets = elf_local_got_offsets (abfd); + struct plt_entry **local_plt = (struct plt_entry **) + (local_got_offsets + symtab_hdr->sh_info); + plist = local_plt + ELF32_R_SYM (irel->r_info); + } + if (plist != NULL) + { + bfd_vma addend = 0; + struct plt_entry *ent; - if (r_type == R_PPC_PLTREL24 && link_info->shared) - addend = irel->r_addend; - ent = find_plt_ent (plist, got2, addend); - if (ent != NULL) + if (r_type == R_PPC_PLTREL24 && link_info->shared) + addend = irel->r_addend; + ent = find_plt_ent (plist, got2, addend); + if (ent != NULL) + { + if (htab->plt_type == PLT_NEW + || h == NULL + || !htab->elf.dynamic_sections_created + || h->dynindx == -1) { - if (htab->plt_type == PLT_NEW - || h == NULL - || !htab->elf.dynamic_sections_created - || h->dynindx == -1) - { - tsec = htab->glink; - toff = ent->glink_offset; - } - else - { - tsec = htab->plt; - toff = ent->plt.offset; - } + tsec = htab->glink; + toff = ent->glink_offset; + } + else + { + tsec = htab->plt; + toff = ent->plt.offset; } } } -- 2.7.4