* elf64-sparc.c (sparc64_elf_relocate_section): Clear the location
authorGeoffrey Keating <geoffk@geoffk.org>
Mon, 16 Oct 2000 20:49:53 +0000 (20:49 +0000)
committerGeoffrey Keating <geoffk@geoffk.org>
Mon, 16 Oct 2000 20:49:53 +0000 (20:49 +0000)
of a GOT reloc.

bfd/ChangeLog
bfd/elf64-sparc.c

index fa4a92e0682a8497212a4a73449411c34ad78cc5..c11b80932ffe188182f7b2a096b0a71a1964d2ee 100644 (file)
@@ -1,5 +1,8 @@
 2000-10-16  Geoffrey Keating  <geoffk@shoggoth.cygnus.com>
 
+       * elf64-sparc.c (sparc64_elf_relocate_section): Clear the location
+       of a GOT reloc.
+
        * elf32-ppc.c (SYMBOL_REFERENCES_LOCAL): New macro.
        (SYMBOL_CALLS_LOCAL): New macro.
        (ppc_elf_adjust_dynamic_symbol): Use SYMBOL_CALLS_LOCAL.
index cef378893173405bea564383129d4d79e875788d..2efe03464d89cdcc76e8e6a9cef7d80a854068df 100644 (file)
@@ -2358,7 +2358,6 @@ sparc64_elf_relocate_section (output_bfd, info, input_bfd, input_section,
                off &= ~1;
              else
                {
-                 bfd_put_64 (output_bfd, relocation, sgot->contents + off);
                  local_got_offsets[r_symndx] |= 1;
 
                  if (info->shared)
@@ -2366,6 +2365,13 @@ sparc64_elf_relocate_section (output_bfd, info, input_bfd, input_section,
                      asection *srelgot;
                      Elf_Internal_Rela outrel;
 
+                     /* The Solaris 2.7 64-bit linker adds the contents
+                        of the location to the value of the reloc.
+                        Note this is different behaviour to the
+                        32-bit linker, which both adds the contents
+                        and ignores the addend.  So clear the location.  */
+                     bfd_put_64 (output_bfd, 0, sgot->contents + off);
+                     
                      /* We need to generate a R_SPARC_RELATIVE reloc
                         for the dynamic linker.  */
                      srelgot = bfd_get_section_by_name(dynobj, ".rela.got");
@@ -2382,6 +2388,8 @@ sparc64_elf_relocate_section (output_bfd, info, input_bfd, input_section,
                                                  + srelgot->reloc_count));
                      ++srelgot->reloc_count;
                    }
+                 else
+                   bfd_put_64 (output_bfd, relocation, sgot->contents + off);
                }
              relocation = sgot->output_offset + off - got_base;
            }