From b4f4e59ffff89dd86068046263008836e145ae41 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 6 Jun 2005 12:59:59 +0000 Subject: [PATCH] bfd/ * elf64-pcc.c (ppc64_elf_gc_mark_hook): For the local sym in .opd case, include addend when indexing .opd section map. (ppc64_elf_edit_opd): Add no_opd_opt param. Do nothing besides clear opd_adjust array if no_opd_opt set. Tidy code. * elf64-ppc.h (ppc64_elf_edit_opd): Update prototype. ld/ * emultempl/ppc64elf.em (ppc_before_allocation): Always run ppc64_elf_edit_opd. --- bfd/ChangeLog | 8 ++++++++ bfd/elf64-ppc.c | 14 ++++++++------ ld/ChangeLog | 5 +++++ ld/emultempl/ppc64elf.em | 4 ++-- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 2c0feac5d5..e5095904c5 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2005-06-06 Alan Modra + + * elf64-pcc.c (ppc64_elf_gc_mark_hook): For the local sym in .opd + case, include addend when indexing .opd section map. + (ppc64_elf_edit_opd): Add no_opd_opt param. Do nothing besides + clear opd_adjust array if no_opd_opt set. Tidy code. + * elf64-ppc.h (ppc64_elf_edit_opd): Update prototype. + 2005-06-04 H.J. Lu * dwarf2.c (comp_unit): Fix a typo in comment. diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 04fcdc9166..5c398b1a9f 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -5064,7 +5064,7 @@ ppc64_elf_gc_mark_hook (asection *sec, if (!rsec->gc_mark) _bfd_elf_gc_mark (info, rsec, ppc64_elf_gc_mark_hook); - rsec = opd_sym_section[sym->st_value / 8]; + rsec = opd_sym_section[(sym->st_value + rel->r_addend) / 8]; } } @@ -6155,6 +6155,7 @@ dec_dynrel_count (bfd_vma r_info, bfd_boolean ppc64_elf_edit_opd (bfd *obfd, struct bfd_link_info *info, + bfd_boolean no_opd_opt, bfd_boolean non_overlapping) { bfd *ibfd; @@ -6184,11 +6185,14 @@ ppc64_elf_edit_opd (bfd *obfd, struct bfd_link_info *info, { /* check_relocs hasn't been called. Must be a ld -r link or --just-symbols object. */ - opd_adjust = bfd_zalloc (obfd, amt); + opd_adjust = bfd_alloc (obfd, amt); ppc64_elf_section_data (sec)->opd.adjust = opd_adjust; } memset (opd_adjust, 0, amt); + if (no_opd_opt) + continue; + if (sec->sec_info_type == ELF_INFO_TYPE_JUST_SYMS) continue; @@ -6358,18 +6362,16 @@ ppc64_elf_edit_opd (bfd *obfd, struct bfd_link_info *info, elf_section_data (sec)->relocs = relstart; - wptr = sec->contents; - rptr = sec->contents; new_contents = sec->contents; - if (add_aux_fields) { new_contents = bfd_malloc (sec->size + cnt_16b * 8); if (new_contents == NULL) return FALSE; need_pad = FALSE; - wptr = new_contents; } + wptr = new_contents; + rptr = sec->contents; write_rel = relstart; skip = FALSE; diff --git a/ld/ChangeLog b/ld/ChangeLog index d4a15a86b3..113bb82345 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,8 @@ +2005-06-06 Alan Modra + + * emultempl/ppc64elf.em (ppc_before_allocation): Always run + ppc64_elf_edit_opd. + 2005-06-05 H.J. Lu * ldexp.c (exp_mark_used_section): Set SEC_KEEP on current diff --git a/ld/emultempl/ppc64elf.em b/ld/emultempl/ppc64elf.em index f002cf3ca5..c1343b6702 100644 --- a/ld/emultempl/ppc64elf.em +++ b/ld/emultempl/ppc64elf.em @@ -102,8 +102,8 @@ ppc_before_allocation (void) { if (stub_file != NULL) { - if (!no_opd_opt - && !ppc64_elf_edit_opd (output_bfd, &link_info, non_overlapping_opd)) + if (!ppc64_elf_edit_opd (output_bfd, &link_info, no_opd_opt, + non_overlapping_opd)) einfo ("%X%P: can not edit %s %E\n", "opd"); if (ppc64_elf_tls_setup (output_bfd, &link_info) && !no_tls_opt)