Author: marius
Date: Sun Mar  6 15:20:11 2011
New Revision: 219340
URL: http://svn.freebsd.org/changeset/base/219340

Log:
  - With the addition of TLS support binutils started to make the addend
    values for resolved symbols relative to relocbase instead of sections
    so detect this case and handle as appropriate, which allows using
    kernel modules linked with affected versions of binutils. Actually I
    think this is a bug in binutils but given that apparently nobody
    complained for nearly six years and powerpc has basically the same
    workaround I decided to put it in for the sparc64 kernel, too.
  - Fix R_SPARC_HIX22 relocations. Apparently these are hardly ever used.

Modified:
  head/libexec/rtld-elf/sparc64/reloc.c
  head/sys/sparc64/sparc64/elf_machdep.c

Modified: head/libexec/rtld-elf/sparc64/reloc.c
==============================================================================
--- head/libexec/rtld-elf/sparc64/reloc.c       Sun Mar  6 13:25:46 2011        
(r219339)
+++ head/libexec/rtld-elf/sparc64/reloc.c       Sun Mar  6 15:20:11 2011        
(r219340)
@@ -355,6 +355,9 @@ reloc_nonplt_object(Obj_Entry *obj, cons
        if (type == R_SPARC_OLO10)
                value = (value & 0x3ff) + ELF64_R_TYPE_DATA(rela->r_info);
 
+       if (type == R_SPARC_HIX22)
+               value ^= 0xffffffffffffffff;
+
        if (RELOC_PC_RELATIVE(type))
                value -= (Elf_Addr)where;
 

Modified: head/sys/sparc64/sparc64/elf_machdep.c
==============================================================================
--- head/sys/sparc64/sparc64/elf_machdep.c      Sun Mar  6 13:25:46 2011        
(r219339)
+++ head/sys/sparc64/sparc64/elf_machdep.c      Sun Mar  6 15:20:11 2011        
(r219340)
@@ -332,7 +332,14 @@ elf_reloc(linker_file_t lf, Elf_Addr rel
                addr = lookup(lf, symidx, 1);
                if (addr == 0)
                        return (-1);
-               value += addr;
+               /*
+                * With the addition of TLS support binutils started to make
+                * addend values relative to relocbase instead of sections.
+                */
+               if (addr > relocbase && addr <= relocbase + value)
+                       value += relocbase;
+               else
+                       value += addr;
                if (RELOC_BARE_SYMBOL(rtype))
                        value = elf_relocaddr(lf, value);
        }
@@ -340,6 +347,9 @@ elf_reloc(linker_file_t lf, Elf_Addr rel
        if (rtype == R_SPARC_OLO10)
                value = (value & 0x3ff) + ELF64_R_TYPE_DATA(rela->r_info);
 
+       if (rtype == R_SPARC_HIX22)
+               value ^= 0xffffffffffffffff;
+
        if (RELOC_PC_RELATIVE(rtype))
                value -= (Elf_Addr)where;
 
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to