diff options
Diffstat (limited to 'arch/powerpc')
-rw-r--r-- | arch/powerpc/crt_arch.h | 31 | ||||
-rw-r--r-- | arch/powerpc/reloc.h | 51 |
2 files changed, 30 insertions, 52 deletions
diff --git a/arch/powerpc/crt_arch.h b/arch/powerpc/crt_arch.h index 8cc53d98..ec3cd29e 100644 --- a/arch/powerpc/crt_arch.h +++ b/arch/powerpc/crt_arch.h @@ -1,12 +1,19 @@ -__asm__("\ -.global _start \n\ -.type _start, %function \n\ -_start: \n\ - mr 3, 1 \n\ - clrrwi 1, 1, 4 \n\ - li 0, 0 \n\ - stwu 1, -16(1) \n\ - mtlr 0 \n\ - stw 0, 0(1) \n\ - bl __cstart \n\ -"); +__asm__( +".global " START " \n" +".type " START ", %function \n" +START ": \n" +" bl 1f \n" +".weak _DYNAMIC \n" +".hidden _DYNAMIC \n" +" .long _DYNAMIC-. \n" +"1: mflr 4 \n" +" lwz 3, 0(4) \n" +" add 4, 3, 4 \n" +" mr 3, 1 \n" +" clrrwi 1, 1, 4 \n" +" li 0, 0 \n" +" stwu 1, -16(1) \n" +" mtlr 0 \n" +" stw 0, 0(1) \n" +" bl " START "_c \n" +); diff --git a/arch/powerpc/reloc.h b/arch/powerpc/reloc.h index 73c583b7..aa5f8c93 100644 --- a/arch/powerpc/reloc.h +++ b/arch/powerpc/reloc.h @@ -1,44 +1,15 @@ -#include <string.h> -#include <elf.h> - #define LDSO_ARCH "powerpc" #define TPOFF_K (-0x7000) -static int remap_rel(int type) -{ - switch(type) { - case R_PPC_ADDR32: - return REL_SYMBOLIC; - case R_PPC_GLOB_DAT: - return REL_GOT; - case R_PPC_JMP_SLOT: - return REL_PLT; - case R_PPC_RELATIVE: - return REL_RELATIVE; - case R_PPC_COPY: - return REL_COPY; - case R_PPC_DTPMOD32: - return REL_DTPMOD; - case R_PPC_DTPREL32: - return REL_DTPOFF; - case R_PPC_TPREL32: - return REL_TPOFF; - } - return 0; -} - -void __reloc_self(int c, size_t *a, size_t *dynv) -{ - char *base; - size_t t[20], n; - for (a+=c+1; *a; a++); - for (a++; *a; a+=2) if (*a<20) t[*a] = a[1]; - base = (char *)t[AT_BASE]; - if (!base) base = (char *)(t[AT_PHDR] & -t[AT_PAGESZ]); - for (a=dynv; *a; a+=2) if (*a<20) t[*a] = a[1]; - n = t[DT_RELASZ]; - for (a=(void *)(base+t[DT_RELA]); n; a+=3, n-=12) - if (a[1]%256 == R_PPC_RELATIVE) - *(size_t *)(base+a[0]) = (size_t)base + a[2]; -} +#define REL_SYMBOLIC R_PPC_ADDR32 +#define REL_GOT R_PPC_GLOB_DAT +#define REL_PLT R_PPC_JMP_SLOT +#define REL_RELATIVE R_PPC_RELATIVE +#define REL_COPY R_PPC_COPY +#define REL_DTPMOD R_PPC_DTPMOD32 +#define REL_DTPOFF R_PPC_DTPREL32 +#define REL_TPOFF R_PPC_TPREL32 + +#define CRTJMP(pc,sp) __asm__ __volatile__( \ + "mr 1,%1 ; mtlr %0 ; blr" : : "r"(pc), "r"(sp) : "memory" ) |