aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2002-05-22 04:22:08 +0000
committerAlan Modra <amodra@gmail.com>2002-05-22 04:22:08 +0000
commitafbe61cf19255fd414d842576757fb7c26f452dc (patch)
tree2a9f7685bf5b7c47e655d1d84ffd1f85ad78cf7a
parent9964235a2b0848443dbf77378380375cf41c9164 (diff)
downloadgdb-afbe61cf19255fd414d842576757fb7c26f452dc.zip
gdb-afbe61cf19255fd414d842576757fb7c26f452dc.tar.gz
gdb-afbe61cf19255fd414d842576757fb7c26f452dc.tar.bz2
* elf64-ppc.c (ppc64_elf_size_stubs): Don't strip .branch_lt.
(ppc64_elf_relocate_section): Handle unresolved relocs in opd.
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elf64-ppc.c20
2 files changed, 19 insertions, 6 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index e4e026b..9470bc5 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,10 @@
2002-05-22 Alan Modra <amodra@bigpond.net.au>
+ * elf64-ppc.c (ppc64_elf_size_stubs): Don't strip .branch_lt.
+ (ppc64_elf_relocate_section): Handle unresolved relocs in opd.
+
+2002-05-22 Alan Modra <amodra@bigpond.net.au>
+
* elf64-ppc.c (ppc64_elf_relocate_section): Return false for
unresolved relocs.
(ppc64_elf_size_dynamic_sections): Check for splt NULL.
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index a304090..d027d81 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -4834,12 +4834,10 @@ ppc64_elf_size_stubs (output_bfd, stub_bfd, info, group_size,
(*htab->layout_sections_again) ();
}
- if (htab->sbrlt->_raw_size == 0)
- {
- _bfd_strip_section_from_output (info, htab->sbrlt);
- if (htab->srelbrlt != NULL)
- _bfd_strip_section_from_output (info, htab->srelbrlt);
- }
+ /* It would be nice to strip .branch_lt from the output if the
+ section is empty, but it's too late. If we strip sections here,
+ the dynamic symbol table is corrupted since the section symbol
+ for the stripped section isn't written. */
ret = true;
@@ -5559,6 +5557,16 @@ ppc64_elf_relocate_section (output_bfd, info, input_bfd, input_section,
relocate = true;
if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
{
+ if (is_opd && h != NULL && info->shared)
+ {
+ /* Lie about opd entries. This case occurs
+ when building shared libraries and we
+ reference a function in another shared
+ lib. In that case we won't use the opd
+ entry in this lib; We ought to edit the
+ opd section to remove unused entries. */
+ unresolved_reloc = false;
+ }
outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
}
else