Module Name: src Committed By: martin Date: Wed Apr 2 14:11:25 UTC 2014
Modified Files: src/libexec/ld.elf_so/arch/sparc64: mdreloc.c Log Message: The table of masks applied for each relocation type was wrong for some relocs with 64bit targets, like GLOB_DAT. Change some instruction patterns used for PLT slots, so -current objdump -d shows what the comment says. Fix encoding of %lox() in PLT slots "close" to -1. Enhance debug output slightly. To generate a diff of this commit: cvs rdiff -u -r1.55 -r1.56 src/libexec/ld.elf_so/arch/sparc64/mdreloc.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/libexec/ld.elf_so/arch/sparc64/mdreloc.c diff -u src/libexec/ld.elf_so/arch/sparc64/mdreloc.c:1.55 src/libexec/ld.elf_so/arch/sparc64/mdreloc.c:1.56 --- src/libexec/ld.elf_so/arch/sparc64/mdreloc.c:1.55 Thu Oct 3 10:45:57 2013 +++ src/libexec/ld.elf_so/arch/sparc64/mdreloc.c Wed Apr 2 14:11:25 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: mdreloc.c,v 1.55 2013/10/03 10:45:57 martin Exp $ */ +/* $NetBSD: mdreloc.c,v 1.56 2014/04/02 14:11:25 martin Exp $ */ /*- * Copyright (c) 2000 Eduardo Horvath. @@ -32,7 +32,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: mdreloc.c,v 1.55 2013/10/03 10:45:57 martin Exp $"); +__RCSID("$NetBSD: mdreloc.c,v 1.56 2014/04/02 14:11:25 martin Exp $"); #endif /* not lint */ #include <errno.h> @@ -170,7 +170,7 @@ static const long reloc_target_bitmask[] _BM(10), _BM(13), _BM(22), /* GOT10, GOT13, GOT22 */ _BM(10), _BM(22), /* _PC10, _PC22 */ _BM(30), 0, /* _WPLT30, _COPY */ - _BM(32), _BM(32), _BM(32), /* _GLOB_DAT, JMP_SLOT, _RELATIVE */ + -1, _BM(32), -1, /* _GLOB_DAT, JMP_SLOT, _RELATIVE */ _BM(32), _BM(32), /* _UA32, PLT32 */ _BM(22), _BM(10), /* _HIPLT22, LOPLT10 */ _BM(32), _BM(22), _BM(10), /* _PCPLT32, _PCPLT22, _PCPLT10 */ @@ -192,18 +192,18 @@ static const long reloc_target_bitmask[] /* * Instruction templates: */ -#define BAA 0x10400000 /* ba,a %xcc, 0 */ +#define BAA 0x30680000 /* ba,a %xcc, 0 */ #define SETHI 0x03000000 /* sethi %hi(0), %g1 */ #define JMP 0x81c06000 /* jmpl %g1+%lo(0), %g0 */ #define NOP 0x01000000 /* sethi %hi(0), %g0 */ -#define OR 0x82806000 /* or %g1, 0, %g1 */ -#define XOR 0x82c06000 /* xor %g1, 0, %g1 */ -#define MOV71 0x8283a000 /* or %o7, 0, %g1 */ -#define MOV17 0x9c806000 /* or %g1, 0, %o7 */ +#define OR 0x82106000 /* or %g1, 0, %g1 */ +#define XOR 0x82186000 /* xor %g1, 0, %g1 */ +#define MOV71 0x8213e000 /* or %o7, 0, %g1 */ +#define MOV17 0x9e106000 /* or %g1, 0, %o7 */ #define CALL 0x40000000 /* call 0 */ -#define SLLX 0x8b407000 /* sllx %g1, 0, %g1 */ +#define SLLX 0x83287000 /* sllx %g1, 0, %g1 */ #define SETHIG5 0x0b000000 /* sethi %hi(0), %g5 */ -#define ORG5 0x82804005 /* or %g1, %g5, %g1 */ +#define ORG5 0x82104005 /* or %g1, %g5, %g1 */ /* %hi(v)/%lo(v) with variable shift */ @@ -603,8 +603,8 @@ _rtld_relocate_plt_object(const Obj_Entr return 0; value = (Elf_Addr)(defobj->relocbase + def->st_value); - rdbg(("bind now/fixup in %s --> new=%p", - defobj->strtab + def->st_name, (void *)value)); + rdbg(("bind now/fixup in %s at %p --> new=%p", + defobj->strtab + def->st_name, (void*)where, (void *)value)); /* * At the PLT entry pointed at by `where', we now construct a direct @@ -696,7 +696,7 @@ _rtld_relocate_plt_object(const Obj_Entr * */ where[3] = JMP; - where[2] = XOR | ((~value) & 0x00001fff); + where[2] = XOR | (value & 0x00003ff) | 0x1c00; where[1] = SETHI | HIVAL(~value, 10); __asm volatile("iflush %0+12" : : "r" (where)); __asm volatile("iflush %0+8" : : "r" (where));