CVS commit: src/libexec/ld.elf_so/arch/powerpc
Module Name:src Committed By: macallan Date: Sun May 24 02:33:11 UTC 2020 Modified Files: src/libexec/ld.elf_so/arch/powerpc: ppc_reloc.c Log Message: new binutils/gcc started emitting R_PPC_UADDR32 reloc entries, so for now treat them like R_PPC_ADDR32 XXX these relocs have been observed in the xf86-video-radeon driver, but only in the AtomBios support code, which is unused on PowerPC. This allows the driver to load but it's not clear if the affected parts would actually function. To generate a diff of this commit: cvs rdiff -u -r1.60 -r1.61 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.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/powerpc/ppc_reloc.c diff -u src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.60 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.61 --- src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.60 Sun Dec 8 23:49:16 2019 +++ src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c Sun May 24 02:33:11 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: ppc_reloc.c,v 1.60 2019/12/08 23:49:16 uwe Exp $ */ +/* $NetBSD: ppc_reloc.c,v 1.61 2020/05/24 02:33:11 macallan Exp $ */ /*- * Copyright (C) 1998 Tsubai Masanari @@ -30,7 +30,7 @@ #include #ifndef lint -__RCSID("$NetBSD: ppc_reloc.c,v 1.60 2019/12/08 23:49:16 uwe Exp $"); +__RCSID("$NetBSD: ppc_reloc.c,v 1.61 2020/05/24 02:33:11 macallan Exp $"); #endif /* not lint */ #include @@ -195,6 +195,7 @@ _rtld_relocate_nonplt_objects(Obj_Entry case R_TYPE(ADDR64): /* S + A */ #else case R_TYPE(ADDR32): /* S + A */ + case R_TYPE(UADDR32): /* S + A */ #endif case R_TYPE(GLOB_DAT): /* S + A */ case R_TYPE(ADDR16_LO): @@ -226,6 +227,7 @@ _rtld_relocate_nonplt_objects(Obj_Entry case R_TYPE(ADDR64): /* S + A */ #else case R_TYPE(ADDR32): /* S + A */ + case R_TYPE(UADDR32): /* S + A */ #endif case R_TYPE(GLOB_DAT): /* S + A */ tmp = (Elf_Addr)(defobj->relocbase + def->st_value +
CVS commit: src/libexec/ld.elf_so/arch/powerpc
Module Name:src Committed By: uwe Date: Sun Dec 8 23:49:16 UTC 2019 Modified Files: src/libexec/ld.elf_so/arch/powerpc: ppc_reloc.c Log Message: Use existing lo() and hi() macros. Same object code is generated. To generate a diff of this commit: cvs rdiff -u -r1.59 -r1.60 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.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/powerpc/ppc_reloc.c diff -u src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.59 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.60 --- src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.59 Sun Dec 8 22:57:51 2019 +++ src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c Sun Dec 8 23:49:16 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: ppc_reloc.c,v 1.59 2019/12/08 22:57:51 uwe Exp $ */ +/* $NetBSD: ppc_reloc.c,v 1.60 2019/12/08 23:49:16 uwe Exp $ */ /*- * Copyright (C) 1998 Tsubai Masanari @@ -30,7 +30,7 @@ #include #ifndef lint -__RCSID("$NetBSD: ppc_reloc.c,v 1.59 2019/12/08 22:57:51 uwe Exp $"); +__RCSID("$NetBSD: ppc_reloc.c,v 1.60 2019/12/08 23:49:16 uwe Exp $"); #endif /* not lint */ #include @@ -246,7 +246,7 @@ _rtld_relocate_nonplt_objects(Obj_Entry tmp = (Elf_Addr)(defobj->relocbase + def->st_value + rela->r_addend); - uint16_t tmp16 = (uint16_t)(tmp & 0x); + uint16_t tmp16 = lo(tmp); uint16_t *where16 = (uint16_t *)where; if (*where16 != tmp16) @@ -262,10 +262,10 @@ _rtld_relocate_nonplt_objects(Obj_Entry tmp = (Elf_Addr)(defobj->relocbase + def->st_value + rela->r_addend); - uint16_t tmp16 = (uint16_t)((tmp >> 16) & 0x); + uint16_t tmp16 = hi(tmp); if (ELF_R_TYPE(rela->r_info) == R_TYPE(ADDR16_HA) - && (tmp & 0x8000)) -++tmp16; + && (tmp & __ha16)) +++tmp16; /* adjust to ha(tmp) */ uint16_t *where16 = (uint16_t *)where; if (*where16 != tmp16)
CVS commit: src/libexec/ld.elf_so/arch/powerpc
Module Name:src Committed By: uwe Date: Sun Dec 8 22:57:51 UTC 2019 Modified Files: src/libexec/ld.elf_so/arch/powerpc: ppc_reloc.c Log Message: Resolve ADDR16_LO, ADDR16_HI, and ADDR16_HA relocs. Recent GNU ld does not resolve them statically if the reloc is in a writable section and the symbol is not already referenced from text. To generate a diff of this commit: cvs rdiff -u -r1.58 -r1.59 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.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/powerpc/ppc_reloc.c diff -u src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.58 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.59 --- src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.58 Sun Dec 30 03:23:46 2018 +++ src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c Sun Dec 8 22:57:51 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: ppc_reloc.c,v 1.58 2018/12/30 03:23:46 christos Exp $ */ +/* $NetBSD: ppc_reloc.c,v 1.59 2019/12/08 22:57:51 uwe Exp $ */ /*- * Copyright (C) 1998 Tsubai Masanari @@ -30,7 +30,7 @@ #include #ifndef lint -__RCSID("$NetBSD: ppc_reloc.c,v 1.58 2018/12/30 03:23:46 christos Exp $"); +__RCSID("$NetBSD: ppc_reloc.c,v 1.59 2019/12/08 22:57:51 uwe Exp $"); #endif /* not lint */ #include @@ -197,6 +197,9 @@ _rtld_relocate_nonplt_objects(Obj_Entry case R_TYPE(ADDR32): /* S + A */ #endif case R_TYPE(GLOB_DAT): /* S + A */ + case R_TYPE(ADDR16_LO): + case R_TYPE(ADDR16_HI): + case R_TYPE(ADDR16_HA): case R_TYPE(DTPMOD): case R_TYPE(DTPREL): case R_TYPE(TPREL): @@ -234,6 +237,50 @@ _rtld_relocate_nonplt_objects(Obj_Entry obj->path, (void *)*where, defobj->path)); break; + /* + * Recent GNU ld does not resolve ADDR16_{LO,HI,HA} if + * the reloc is in a writable section and the symbol + * is not already referenced from text. + */ + case R_TYPE(ADDR16_LO): { + tmp = (Elf_Addr)(defobj->relocbase + def->st_value + + rela->r_addend); + + uint16_t tmp16 = (uint16_t)(tmp & 0x); + + uint16_t *where16 = (uint16_t *)where; + if (*where16 != tmp16) +*where16 = tmp16; + rdbg(("ADDR16_LO %s in %s --> #lo(%p) = 0x%x in %s", + obj->strtab + obj->symtab[symnum].st_name, + obj->path, (void *)tmp, tmp16, defobj->path)); + break; + } + + case R_TYPE(ADDR16_HI): + case R_TYPE(ADDR16_HA): { + tmp = (Elf_Addr)(defobj->relocbase + def->st_value + + rela->r_addend); + + uint16_t tmp16 = (uint16_t)((tmp >> 16) & 0x); + if (ELF_R_TYPE(rela->r_info) == R_TYPE(ADDR16_HA) + && (tmp & 0x8000)) +++tmp16; + + uint16_t *where16 = (uint16_t *)where; + if (*where16 != tmp16) +*where16 = tmp16; + rdbg(("ADDR16_H%c %s in %s --> #h%c(%p) = 0x%x in %s", + (ELF_R_TYPE(rela->r_info) == R_TYPE(ADDR16_HI) + ? 'I' : 'A'), + obj->strtab + obj->symtab[symnum].st_name, + obj->path, + (ELF_R_TYPE(rela->r_info) == R_TYPE(ADDR16_HI) + ? 'i' : 'a'), + (void *)tmp, tmp16, defobj->path)); + break; + } + case R_TYPE(RELATIVE): /* B + A */ *where = (Elf_Addr)(obj->relocbase + rela->r_addend); rdbg(("RELATIVE in %s --> %p", obj->path,
CVS commit: src/libexec/ld.elf_so/arch/powerpc
Module Name:src Committed By: christos Date: Sun Dec 30 03:23:46 UTC 2018 Modified Files: src/libexec/ld.elf_so/arch/powerpc: ppc_reloc.c Log Message: - fix wrong reloc name in assert - fix uninitialized To generate a diff of this commit: cvs rdiff -u -r1.57 -r1.58 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.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/powerpc/ppc_reloc.c diff -u src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.57 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.58 --- src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.57 Tue Apr 3 17:10:27 2018 +++ src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c Sat Dec 29 22:23:46 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: ppc_reloc.c,v 1.57 2018/04/03 21:10:27 joerg Exp $ */ +/* $NetBSD: ppc_reloc.c,v 1.58 2018/12/30 03:23:46 christos Exp $ */ /*- * Copyright (C) 1998 Tsubai Masanari @@ -30,7 +30,7 @@ #include #ifndef lint -__RCSID("$NetBSD: ppc_reloc.c,v 1.57 2018/04/03 21:10:27 joerg Exp $"); +__RCSID("$NetBSD: ppc_reloc.c,v 1.58 2018/12/30 03:23:46 christos Exp $"); #endif /* not lint */ #include @@ -188,6 +188,7 @@ _rtld_relocate_nonplt_objects(Obj_Entry unsigned long symnum; where = (Elf_Addr *)(obj->relocbase + rela->r_offset); + symnum = ELF_R_SYM(rela->r_info); switch (ELF_R_TYPE(rela->r_info)) { #ifdef _LP64 @@ -199,7 +200,6 @@ _rtld_relocate_nonplt_objects(Obj_Entry case R_TYPE(DTPMOD): case R_TYPE(DTPREL): case R_TYPE(TPREL): - symnum = ELF_R_SYM(rela->r_info); if (last_symnum != symnum) { last_symnum = symnum; def = _rtld_find_symdef(symnum, obj, , @@ -327,7 +327,7 @@ _rtld_relocate_plt_lazy(Obj_Entry *obj) size_t reloff = rela - obj->pltrela; Elf_Word *where = (Elf_Word *)(obj->relocbase + rela->r_offset); - assert(ELF_R_TYPE(rela->r_info) == R_TYPE(JUMP_SLOT) || + assert(ELF_R_TYPE(rela->r_info) == R_TYPE(JMP_SLOT) || ELF_R_TYPE(rela->r_info) == R_TYPE(IRELATIVE)); if (ELF_R_TYPE(rela->r_info) == R_TYPE(IRELATIVE)) {
CVS commit: src/libexec/ld.elf_so/arch/powerpc
Module Name:src Committed By: matt Date: Fri Aug 15 09:40:07 UTC 2014 Modified Files: src/libexec/ld.elf_so/arch/powerpc: Makefile.inc Log Message: Use -fPIC since powerpc64 is always compiled as -fPIC and -fpic would cause __PIC__ to change. To generate a diff of this commit: cvs rdiff -u -r1.14 -r1.15 src/libexec/ld.elf_so/arch/powerpc/Makefile.inc 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/powerpc/Makefile.inc diff -u src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.14 src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.15 --- src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.14 Wed Aug 13 15:56:52 2014 +++ src/libexec/ld.elf_so/arch/powerpc/Makefile.inc Fri Aug 15 09:40:07 2014 @@ -1,10 +1,9 @@ -# $NetBSD: Makefile.inc,v 1.14 2014/08/13 15:56:52 joerg Exp $ +# $NetBSD: Makefile.inc,v 1.15 2014/08/15 09:40:07 matt Exp $ SRCS+= ppc_reloc.c LDFLAGS+= -Wl,-e,_rtld_start -# XXX Should not be in CPPFLAGS! -CPPFLAGS+= -fpic +CPPFLAGS+= -fPIC .if ${LDELFSO_MACHINE_ARCH} == powerpc64 SRCS+= rtld_start64.S
CVS commit: src/libexec/ld.elf_so/arch/powerpc
Module Name:src Committed By: joerg Date: Wed Aug 13 15:56:52 UTC 2014 Modified Files: src/libexec/ld.elf_so/arch/powerpc: Makefile.inc Log Message: Build position independent on PPC64, too. To generate a diff of this commit: cvs rdiff -u -r1.13 -r1.14 src/libexec/ld.elf_so/arch/powerpc/Makefile.inc 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/powerpc/Makefile.inc diff -u src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.13 src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.14 --- src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.13 Thu Mar 6 07:47:39 2014 +++ src/libexec/ld.elf_so/arch/powerpc/Makefile.inc Wed Aug 13 15:56:52 2014 @@ -1,16 +1,16 @@ -# $NetBSD: Makefile.inc,v 1.13 2014/03/06 07:47:39 matt Exp $ +# $NetBSD: Makefile.inc,v 1.14 2014/08/13 15:56:52 joerg Exp $ SRCS+= ppc_reloc.c LDFLAGS+= -Wl,-e,_rtld_start # XXX Should not be in CPPFLAGS! +CPPFLAGS+= -fpic + .if ${LDELFSO_MACHINE_ARCH} == powerpc64 SRCS+= rtld_start64.S CPPFLAGS+= -DELFSIZE=64 .else SRCS+= rtld_start.S -CPPFLAGS+= -fpic CPPFLAGS+= -DELFSIZE=32 LDFLAGS+= -Wl,--script,${.CURDIR}/arch/powerpc/ld.so.script .endif -
CVS commit: src/libexec/ld.elf_so/arch/powerpc
Module Name:src Committed By: matt Date: Mon Jul 28 17:28:13 UTC 2014 Modified Files: src/libexec/ld.elf_so/arch/powerpc: ppc_reloc.c Log Message: Fix parenthesis on __ha macro To generate a diff of this commit: cvs rdiff -u -r1.51 -r1.52 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.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/powerpc/ppc_reloc.c diff -u src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.51 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.52 --- src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.51 Thu Mar 6 19:19:40 2014 +++ src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c Mon Jul 28 17:28:13 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: ppc_reloc.c,v 1.51 2014/03/06 19:19:40 matt Exp $ */ +/* $NetBSD: ppc_reloc.c,v 1.52 2014/07/28 17:28:13 matt Exp $ */ /*- * Copyright (C) 1998 Tsubai Masanari @@ -30,7 +30,7 @@ #include sys/cdefs.h #ifndef lint -__RCSID($NetBSD: ppc_reloc.c,v 1.51 2014/03/06 19:19:40 matt Exp $); +__RCSID($NetBSD: ppc_reloc.c,v 1.52 2014/07/28 17:28:13 matt Exp $); #endif /* not lint */ #include stdarg.h @@ -51,7 +51,7 @@ void _rtld_powerpc_pltresolve(Elf_Word, #define __ha48 __u64(0x8000) #define __ha32 __u64(0x8000) #define __ha16 __u32(0x8000) -#define __ha(x,n) x) (n)) + ((x) __ha##n) == __ha##n) 0x) +#define __ha(x,n) x) (n)) + (((x) __ha##n) == __ha##n)) 0x) #define __hi(x,n) (((x) (n)) 0x) #ifdef __LP64 #define highesta(x) __ha(__u64(x), 48)
CVS commit: src/libexec/ld.elf_so/arch/powerpc
Module Name:src Committed By: matt Date: Thu Mar 6 09:34:07 UTC 2014 Modified Files: src/libexec/ld.elf_so/arch/powerpc: ppc_reloc.c Log Message: Make ELF64 aware. To generate a diff of this commit: cvs rdiff -u -r1.49 -r1.50 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.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/powerpc/ppc_reloc.c diff -u src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.49 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.50 --- src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.49 Fri Mar 25 18:07:06 2011 +++ src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c Thu Mar 6 09:34:07 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: ppc_reloc.c,v 1.49 2011/03/25 18:07:06 joerg Exp $ */ +/* $NetBSD: ppc_reloc.c,v 1.50 2014/03/06 09:34:07 matt Exp $ */ /*- * Copyright (C) 1998 Tsubai Masanari @@ -30,7 +30,7 @@ #include sys/cdefs.h #ifndef lint -__RCSID($NetBSD: ppc_reloc.c,v 1.49 2011/03/25 18:07:06 joerg Exp $); +__RCSID($NetBSD: ppc_reloc.c,v 1.50 2014/03/06 09:34:07 matt Exp $); #endif /* not lint */ #include stdarg.h @@ -46,19 +46,37 @@ __RCSID($NetBSD: ppc_reloc.c,v 1.49 201 void _rtld_powerpc_pltcall(Elf_Word); void _rtld_powerpc_pltresolve(Elf_Word, Elf_Word); -#define ha(x) u_int32_t)(x) 0x8000) ? \ - ((u_int32_t)(x) + 0x1) : (u_int32_t)(x)) 16) -#define l(x) ((u_int32_t)(x) 0x) - +#define __u64(x) ((uint64_t)(x)) +#define __u32(x) ((uint32_t)(x)) +#define __ha48 __u64(0x8000) +#define __ha32 __u64(0x8000) +#define __ha16 __u32(0x8000) +#define __ha(x,n) x) (n)) + ((x) __ha##n) == __ha##n) 0x) +#define __hi(x,n) (((x) (n)) 0x) +#ifdef __LP64 +#define highesta(x) __ha(__u64(x), 48) +#define highest(x) __hi(__u64(x), 48) +#define higher(x) __ha(__u64(x), 32) +#define higher(x) __hi(__u64(x), 32) +#endif +#define ha(x) __ha(__u32(x), 16) +#define hi(x) __hi(__u32(x), 16) +#define lo(x) (__u32(x) 0x) + +#ifdef _LP64 +/* function descriptor for _rtld_bind_start */ +extern const uint64_t _rtld_bind_start[3]; +#else void _rtld_bind_bssplt_start(void); void _rtld_bind_secureplt_start(void); +#endif void _rtld_relocate_nonplt_self(Elf_Dyn *, Elf_Addr); caddr_t _rtld_bind(const Obj_Entry *, Elf_Word); static int _rtld_relocate_plt_object(const Obj_Entry *, const Elf_Rela *, int, Elf_Addr *); /* - * The PPC PLT format consists of three sections: + * The PPC32 PLT format consists of three sections: * (1) The pltcall and pltresolve glue code. This is always 18 words. * (2) The code part of the PLT entries. There are 2 words per entry for * up to 8192 entries, then 4 words per entry for any additional entries. @@ -67,15 +85,19 @@ static int _rtld_relocate_plt_object(con * per entry). */ -/* - * Setup the plt glue routines (for bss-plt). - */ -#define PLTCALL_SIZE 20 -#define PLTRESOLVE_SIZE 24 - void _rtld_setup_pltgot(const Obj_Entry *obj) { +#ifdef _LP64 + /* + * For powerpc64, just copy the function descriptor to pltgot[0]. + */ + if (obj-pltgot != NULL) { + obj-pltgot[0] = (Elf_Addr) _rtld_bind_start[0]; + obj-pltgot[1] = (Elf_Addr) _rtld_bind_start[1]; + obj-pltgot[2] = (Elf_Addr) obj; + } +#else /* * Secure-PLT is much more sane. */ @@ -86,6 +108,12 @@ _rtld_setup_pltgot(const Obj_Entry *obj) obj-path, obj-gotptr, (void *) obj-gotptr[1], (void *) obj-gotptr[2])); } else { +/* + * Setup the plt glue routines (for bss-plt). + */ +#define BSSPLTCALL_SIZE 20 +#define BSSPLTRESOLVE_SIZE 24 + Elf_Word *pltcall, *pltresolve; Elf_Word *jmptab; int N = obj-pltrelalim - obj-pltrela; @@ -101,17 +129,17 @@ _rtld_setup_pltgot(const Obj_Entry *obj) pltcall = obj-pltgot; jmptab = pltcall + 18 + N * 2; - memcpy(pltcall, _rtld_powerpc_pltcall, PLTCALL_SIZE); + memcpy(pltcall, _rtld_powerpc_pltcall, BSSPLTCALL_SIZE); pltcall[1] |= ha(jmptab); - pltcall[2] |= l(jmptab); + pltcall[2] |= lo(jmptab); pltresolve = obj-pltgot + 8; - memcpy(pltresolve, _rtld_powerpc_pltresolve, PLTRESOLVE_SIZE); + memcpy(pltresolve, _rtld_powerpc_pltresolve, BSSPLTRESOLVE_SIZE); pltresolve[0] |= ha(_rtld_bind_bssplt_start); - pltresolve[1] |= l(_rtld_bind_bssplt_start); + pltresolve[1] |= lo(_rtld_bind_bssplt_start); pltresolve[3] |= ha(obj); - pltresolve[4] |= l(obj); + pltresolve[4] |= lo(obj); /* * Invalidate the icache for only the code part of the PLT @@ -119,6 +147,7 @@ _rtld_setup_pltgot(const Obj_Entry *obj) */ __syncicache(pltcall, (char *)jmptab - (char *)pltcall); } +#endif } void @@ -167,8 +196,12 @@ _rtld_relocate_nonplt_objects(Obj_Entry case R_TYPE(NONE): break; - case R_TYPE(32): /* word32 S + A */ - case R_TYPE(GLOB_DAT): /* word32 S + A */ +#ifdef _LP64 + case R_TYPE(ADDR64): /* address S + A */ +#else + case R_TYPE(ADDR32): /* address S + A */ +#endif + case
CVS commit: src/libexec/ld.elf_so/arch/powerpc
Module Name:src Committed By: matt Date: Fri Mar 7 05:57:46 UTC 2014 Modified Files: src/libexec/ld.elf_so/arch/powerpc: ld.so.script Log Message: Change OUTPUT to powerpc:common to make powerpc64 ld happy To generate a diff of this commit: cvs rdiff -u -r1.3 -r1.4 src/libexec/ld.elf_so/arch/powerpc/ld.so.script 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/powerpc/ld.so.script diff -u src/libexec/ld.elf_so/arch/powerpc/ld.so.script:1.3 src/libexec/ld.elf_so/arch/powerpc/ld.so.script:1.4 --- src/libexec/ld.elf_so/arch/powerpc/ld.so.script:1.3 Mon Sep 9 14:45:37 2002 +++ src/libexec/ld.elf_so/arch/powerpc/ld.so.script Fri Mar 7 05:57:46 2014 @@ -1,6 +1,6 @@ OUTPUT_FORMAT(elf32-powerpc, elf32-powerpc, elf32-powerpc) -OUTPUT_ARCH(powerpc) +OUTPUT_ARCH(powerpc:common) ENTRY(_start) /* Do we need any of these for elf? __DYNAMIC = 0;*/
CVS commit: src/libexec/ld.elf_so/arch/powerpc
Module Name:src Committed By: matt Date: Thu Mar 6 07:47:19 UTC 2014 Added Files: src/libexec/ld.elf_so/arch/powerpc: rtld_start64.S Log Message: Startup file for powerpc64. (too many difference with ppc32 to do #ifdef dance) To generate a diff of this commit: cvs rdiff -u -r0 -r1.1 src/libexec/ld.elf_so/arch/powerpc/rtld_start64.S Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Added files: Index: src/libexec/ld.elf_so/arch/powerpc/rtld_start64.S diff -u /dev/null src/libexec/ld.elf_so/arch/powerpc/rtld_start64.S:1.1 --- /dev/null Thu Mar 6 07:47:19 2014 +++ src/libexec/ld.elf_so/arch/powerpc/rtld_start64.S Thu Mar 6 07:47:19 2014 @@ -0,0 +1,129 @@ +/* $NetBSD: rtld_start64.S,v 1.1 2014/03/06 07:47:19 matt Exp $ */ + +/*- + * Copyright (C) 1998 Tsubai Masanari + * Portions copyright 2002 Charles M. Hannum r...@ihack.net + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *notice, this list of conditions and the following disclaimer in the + *documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + *derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include machine/asm.h + + .globl _rtld_relocate_nonplt_self + .globl _rtld + + .text +ENTRY_NOPROFILE(_rtld_start) + mr %r23,%r3 // argc + mr %r24,%r4 // argv + mr %r25,%r5 // envp +/* mr %r26,%r6 // obj (always 0) */ +/* mr %r27,%r7 // cleanup (always 0) */ + mr %r28,%r8 // ps_strings + li %r0,0 + stdu %r0,-64(%r1) // terminate stack chain + std %r2,40(%r1) // save TOC + std %r0,16(%r1) // ditto + + bcl 20,31,1f +1: mflr %r30 + ld %r3,0(%r2) // TOC[0] = TOC + sub %r29,%r2,%r3 // compute relocbase + + addis %r3,%r3,_DYNAMIC-1b@ha // get _DYNAMIC actual address + addi %r3,%r3,_DYNAMIC-1b@l + mr %r4,%r29 // r4 = relocbase + CALL(_rtld_relocate_nonplt_self) + + addi %r3,%r1,48 // sp = local variable space + mr %r4,%r29 // r4 = relocbase + CALL(_rtld) // _start = _rtld(sp, relocbase) + + ld %r0,0(%r3) // func address + ld %r2,8(%r3) // TOC address + ld %r11,16(%r3) // environment pointer + mtctr %r0 // so we can call it. + + mr %r3,%r23 // argc + mr %r4,%r24 // argv + mr %r5,%r25 // envp + ld %r6,56(%r1) // obj = localvar[1] + ld %r7,48(%r1) // cleanup = localvar[0] + mr %r8,%r28 // ps_strings + + bctrl // _start(argc, argv, envp, obj, cleanup, ps_strings) + nop + + li %r0,1 // _exit() + sc +END(_rtld_start) + + .globl _rtld_bind + +/* + * %r0 has the index of the rela, %r12 has a pointer to the plt entry. + */ +ENTRY_NOPROFILE(_rtld_bind_start) + std %r3,-72(%r1) // save argument register + std %r4,-64(%r1) // save argument register + std %r5,-56(%r1) // save argument register + std %r6,-48(%r1) // save argument register + std %r7,-40(%r1) // save argument register + std %r8,-32(%r1) // save argument register + std %r9,-24(%r1) // save argument register + std %r10,-16(%r1) // save argument register + std %r31,-8(%r1) // save register + stdu %r1,-(48+80)(%r1) // create back chain + mflr %r10 + std %r10,16(%r1) // save LR + mfcr %r9 + std %r9,8(%r1) // save CR to be safe + + mr %r31, %r12 // save this across bind call + mr %r3, %r11 // obj + mr %r4, %r0 // reloff + + CALL(_rtld_bind) // _rtld_bind(obj, reloff) + + mtctr %r3 + ld %r2,8(%r31) // load TOC for function + ld %r11,16(%r31) // load env ptr for function. + + ld %r0,8(%r1) // get saved CR + mtcr %r0 // restore it + ld %r0,16(%r1) // get saved LR + mtlr %r0 // restore it + + addi %r1,%r1,(48+80) // adjust stack + ld %r3,-72(%r1) // restore argument register + ld %r4,-64(%r1) // restore argument register + ld %r5,-56(%r1) // restore argument register + ld %r6,-48(%r1) // restore argument register + ld %r7,-40(%r1) // restore argument register + ld
CVS commit: src/libexec/ld.elf_so/arch/powerpc
Module Name:src Committed By: matt Date: Thu Mar 6 07:47:39 UTC 2014 Modified Files: src/libexec/ld.elf_so/arch/powerpc: Makefile.inc Log Message: powerpc64 changes To generate a diff of this commit: cvs rdiff -u -r1.12 -r1.13 src/libexec/ld.elf_so/arch/powerpc/Makefile.inc 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/powerpc/Makefile.inc diff -u src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.12 src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.13 --- src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.12 Wed Oct 26 15:56:58 2011 +++ src/libexec/ld.elf_so/arch/powerpc/Makefile.inc Thu Mar 6 07:47:39 2014 @@ -1,11 +1,16 @@ -# $NetBSD: Makefile.inc,v 1.12 2011/10/26 15:56:58 chs Exp $ +# $NetBSD: Makefile.inc,v 1.13 2014/03/06 07:47:39 matt Exp $ -SRCS+= rtld_start.S ppc_reloc.c +SRCS+= ppc_reloc.c +LDFLAGS+= -Wl,-e,_rtld_start # XXX Should not be in CPPFLAGS! +.if ${LDELFSO_MACHINE_ARCH} == powerpc64 +SRCS+= rtld_start64.S +CPPFLAGS+= -DELFSIZE=64 +.else +SRCS+= rtld_start.S CPPFLAGS+= -fpic - CPPFLAGS+= -DELFSIZE=32 - -LDFLAGS+= -Wl,-e,_rtld_start LDFLAGS+= -Wl,--script,${.CURDIR}/arch/powerpc/ld.so.script +.endif +
CVS commit: src/libexec/ld.elf_so/arch/powerpc
Module Name:src Committed By: chs Date: Wed Oct 26 15:56:58 UTC 2011 Modified Files: src/libexec/ld.elf_so/arch/powerpc: Makefile.inc Log Message: avoid linker warnings with the new binutils by not forcing ld.elf_so to be soft-float. the floating-point usage in ld.elf_so is only because of stdarg functions like printf(), and gcc 4.5 is good about not actually executing the FP instructions in such functions unless FP values are passed to them, which ld.elf_so doesn't do. To generate a diff of this commit: cvs rdiff -u -r1.11 -r1.12 src/libexec/ld.elf_so/arch/powerpc/Makefile.inc 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/powerpc/Makefile.inc diff -u src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.11 src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.12 --- src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.11 Thu Oct 22 21:56:13 2009 +++ src/libexec/ld.elf_so/arch/powerpc/Makefile.inc Wed Oct 26 15:56:58 2011 @@ -1,9 +1,9 @@ -# $NetBSD: Makefile.inc,v 1.11 2009/10/22 21:56:13 skrll Exp $ +# $NetBSD: Makefile.inc,v 1.12 2011/10/26 15:56:58 chs Exp $ SRCS+= rtld_start.S ppc_reloc.c # XXX Should not be in CPPFLAGS! -CPPFLAGS+= -fpic -msoft-float +CPPFLAGS+= -fpic CPPFLAGS+= -DELFSIZE=32
CVS commit: src/libexec/ld.elf_so/arch/powerpc
Module Name:src Committed By: mrg Date: Mon Sep 26 01:52:22 UTC 2011 Modified Files: src/libexec/ld.elf_so/arch/powerpc: rtld_start.S Log Message: match END() with a relevant ENTRY*(). gas 2.21 complains about the non-constant-ness of the symbol otherwise. To generate a diff of this commit: cvs rdiff -u -r1.16 -r1.17 src/libexec/ld.elf_so/arch/powerpc/rtld_start.S 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/powerpc/rtld_start.S diff -u src/libexec/ld.elf_so/arch/powerpc/rtld_start.S:1.16 src/libexec/ld.elf_so/arch/powerpc/rtld_start.S:1.17 --- src/libexec/ld.elf_so/arch/powerpc/rtld_start.S:1.16 Fri Mar 4 00:40:48 2011 +++ src/libexec/ld.elf_so/arch/powerpc/rtld_start.S Mon Sep 26 01:52:22 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: rtld_start.S,v 1.16 2011/03/04 00:40:48 matt Exp $ */ +/* $NetBSD: rtld_start.S,v 1.17 2011/09/26 01:52:22 mrg Exp $ */ /*- * Copyright (C) 1998 Tsubai Masanari @@ -124,7 +124,7 @@ ENTRY_NOPROFILE(_rtld_bind_bssplt_start) addi %r1,%r1,160 bctr -END(_rtld_bind_start) +END(_rtld_bind_secureplt_start) .globl _rtld_powerpc_pltcall .globl _rtld_powerpc_pltresolve
CVS commit: src/libexec/ld.elf_so/arch/powerpc
Module Name:src Committed By: matt Date: Fri Mar 4 00:40:49 UTC 2011 Modified Files: src/libexec/ld.elf_so/arch/powerpc: rtld_start.S Log Message: Don't rely on 32bit math. To generate a diff of this commit: cvs rdiff -u -r1.15 -r1.16 src/libexec/ld.elf_so/arch/powerpc/rtld_start.S 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/powerpc/rtld_start.S diff -u src/libexec/ld.elf_so/arch/powerpc/rtld_start.S:1.15 src/libexec/ld.elf_so/arch/powerpc/rtld_start.S:1.16 --- src/libexec/ld.elf_so/arch/powerpc/rtld_start.S:1.15 Thu Feb 10 02:28:20 2011 +++ src/libexec/ld.elf_so/arch/powerpc/rtld_start.S Fri Mar 4 00:40:48 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: rtld_start.S,v 1.15 2011/02/10 02:28:20 matt Exp $ */ +/* $NetBSD: rtld_start.S,v 1.16 2011/03/04 00:40:48 matt Exp $ */ /*- * Copyright (C) 1998 Tsubai Masanari @@ -94,8 +94,8 @@ * where inv(n) = (0x1 + n - 1) / n */ mr %r0,%r11 - lis %r11,0x1000b/12@h # load multiplicative inverse of 12 - ori %r11,%r11,0x1000b/12@l + lis %r11,0x1556@h # load multiplicative inverse of 12 + ori %r11,%r11,0x1556@l mulhwu %r11,%r11,%r0 # get high half of multiplication b 1f
CVS commit: src/libexec/ld.elf_so/arch/powerpc
Module Name:src Committed By: skrll Date: Thu Oct 22 21:56:14 UTC 2009 Modified Files: src/libexec/ld.elf_so/arch/powerpc: Makefile.inc Log Message: Fix start symbol for newer binutils. To generate a diff of this commit: cvs rdiff -u -r1.10 -r1.11 src/libexec/ld.elf_so/arch/powerpc/Makefile.inc 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/powerpc/Makefile.inc diff -u src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.10 src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.11 --- src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.10 Sat Jun 4 16:17:17 2005 +++ src/libexec/ld.elf_so/arch/powerpc/Makefile.inc Thu Oct 22 21:56:13 2009 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile.inc,v 1.10 2005/06/04 16:17:17 lukem Exp $ +# $NetBSD: Makefile.inc,v 1.11 2009/10/22 21:56:13 skrll Exp $ SRCS+= rtld_start.S ppc_reloc.c @@ -7,5 +7,5 @@ CPPFLAGS+= -DELFSIZE=32 -LDFLAGS+= -Wl,-e,.rtld_start +LDFLAGS+= -Wl,-e,_rtld_start LDFLAGS+= -Wl,--script,${.CURDIR}/arch/powerpc/ld.so.script
CVS commit: src/libexec/ld.elf_so/arch/powerpc
Module Name:src Committed By: he Date: Sun May 24 20:35:41 UTC 2009 Modified Files: src/libexec/ld.elf_so/arch/powerpc: ppc_reloc.c Log Message: Apply fix borrowed from i386: Fix const issue (cast const pointers to const uint8_t * instead of caddr_t). To generate a diff of this commit: cvs rdiff -u -r1.41 -r1.42 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.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/powerpc/ppc_reloc.c diff -u src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.41 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.42 --- src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.41 Thu Jul 24 04:39:25 2008 +++ src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c Sun May 24 20:35:41 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: ppc_reloc.c,v 1.41 2008/07/24 04:39:25 matt Exp $ */ +/* $NetBSD: ppc_reloc.c,v 1.42 2009/05/24 20:35:41 he Exp $ */ /*- * Copyright (C) 1998 Tsubai Masanari @@ -30,7 +30,7 @@ #include sys/cdefs.h #ifndef lint -__RCSID($NetBSD: ppc_reloc.c,v 1.41 2008/07/24 04:39:25 matt Exp $); +__RCSID($NetBSD: ppc_reloc.c,v 1.42 2009/05/24 20:35:41 he Exp $); #endif /* not lint */ #include stdarg.h @@ -123,7 +123,7 @@ break; } } - relalim = (const Elf_Rela *)((caddr_t)rela + relasz); + relalim = (const Elf_Rela *)((const uint8_t *)rela + relasz); for (; rela relalim; rela++) { where = (Elf_Addr *)(relocbase + rela-r_offset); *where = (Elf_Addr)(relocbase + rela-r_addend);