svn commit: r219340 - in head: libexec/rtld-elf/sparc64 sys/sparc64/sparc64

Marius Strobl marius at FreeBSD.org
Sun Mar 6 15:20:12 UTC 2011


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;
 


More information about the svn-src-head mailing list