* elf64-ppc.c (ppc64_elf_next_input_section): Update comment.
authorAlan Modra <amodra@gmail.com>
Tue, 12 Aug 2003 05:58:10 +0000 (05:58 +0000)
committerAlan Modra <amodra@gmail.com>
Tue, 12 Aug 2003 05:58:10 +0000 (05:58 +0000)
(ppc64_elf_relocate_section): For zero sym R_PPC64_TOC relocs,
use the function sym from the previous reloc.

bfd/ChangeLog
bfd/elf64-ppc.c

index 93cd6c0161a3c0dd47404bc336666cbe47c0cf54..86cdde2dd0e5a367931e0fda329098a157114871 100644 (file)
@@ -1,3 +1,9 @@
+2003-08-12  Alan Modra  <amodra@bigpond.net.au>
+
+       * elf64-ppc.c (ppc64_elf_next_input_section): Update comment.
+       (ppc64_elf_relocate_section): For zero sym R_PPC64_TOC relocs,
+       use the function sym from the previous reloc.
+
 2003-08-11  Jakub Jelinek  <jakub@redhat.com>
 
        * elf32-i386.c (elf_i386_relocate_section): Make undefined symbols
index 4291f9bb01d5817340adf34eb5fb9dfd14ed0daf..c0f5b82507230ba3860930f2e8e1f2c534ab7272 100644 (file)
@@ -6608,7 +6608,8 @@ ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
 
   /* If a code section has a function that uses the TOC then we need
      to use the right TOC (obviously).  Also, make sure that .opd gets
-     the correct TOC value.  */
+     the correct TOC value for R_PPC64_TOC relocs that don't have or
+     can't find their function symbol (shouldn't ever happen now).  */
   if (isec->has_gp_reloc || (isec->flags & SEC_CODE) == 0)
     {
       if (elf_gp (isec->owner) != 0)
@@ -7327,6 +7328,16 @@ ppc64_elf_relocate_section (bfd *output_bfd,
 
       r_type = ELF64_R_TYPE (rel->r_info);
       r_symndx = ELF64_R_SYM (rel->r_info);
+
+      /* For old style R_PPC64_TOC relocs with a zero symbol, use the
+        symbol of the previous ADDR64 reloc.  The symbol gives us the
+        proper TOC base to use.  */
+      if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
+         && rel != relocs
+         && ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_ADDR64
+         && is_opd)
+       r_symndx = ELF64_R_SYM (rel[-1].r_info);
+
       sym = NULL;
       sec = NULL;
       h = NULL;