diff options
author | Alan Modra <amodra@gmail.com> | 2002-05-22 04:22:08 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2002-05-22 04:22:08 +0000 |
commit | afbe61cf19255fd414d842576757fb7c26f452dc (patch) | |
tree | 2a9f7685bf5b7c47e655d1d84ffd1f85ad78cf7a /bfd/elf64-ppc.c | |
parent | 9964235a2b0848443dbf77378380375cf41c9164 (diff) | |
download | gdb-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.
Diffstat (limited to 'bfd/elf64-ppc.c')
-rw-r--r-- | bfd/elf64-ppc.c | 20 |
1 files changed, 14 insertions, 6 deletions
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 |