diff options
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/crt_arch.h | 25 | ||||
-rw-r--r-- | arch/arm/reloc.h | 36 |
2 files changed, 27 insertions, 34 deletions
diff --git a/arch/arm/crt_arch.h b/arch/arm/crt_arch.h index bed99c27..d1f9a662 100644 --- a/arch/arm/crt_arch.h +++ b/arch/arm/crt_arch.h @@ -1,10 +1,15 @@ -__asm__("\ -.global _start \n\ -.type _start,%function \n\ -_start: \n\ - mov fp, #0 \n\ - mov lr, #0 \n\ - mov a1, sp \n\ - and sp, sp, #-16 \n\ - bl __cstart \n\ -"); +__asm__( +".global " START " \n" +".type " START ",%function \n" +START ": \n" +" mov fp, #0 \n" +" mov lr, #0 \n" +" mov a1, sp \n" +" ldr a2, 1f \n" +"2: add a2, pc, a2 \n" +" and sp, sp, #-16 \n" +" bl " START "_c \n" +".weak _DYNAMIC \n" +".hidden _DYNAMIC \n" +"1: .word _DYNAMIC-2b-8 \n" +); diff --git a/arch/arm/reloc.h b/arch/arm/reloc.h index ee39b7fd..dec0031e 100644 --- a/arch/arm/reloc.h +++ b/arch/arm/reloc.h @@ -1,5 +1,3 @@ -#include <string.h> -#include <elf.h> #include <endian.h> #if __BYTE_ORDER == __BIG_ENDIAN @@ -20,25 +18,15 @@ #define TPOFF_K 8 -static int remap_rel(int type) -{ - switch(type) { - case R_ARM_ABS32: - return REL_SYMBOLIC; - case R_ARM_GLOB_DAT: - return REL_GOT; - case R_ARM_JUMP_SLOT: - return REL_PLT; - case R_ARM_RELATIVE: - return REL_RELATIVE; - case R_ARM_COPY: - return REL_COPY; - case R_ARM_TLS_DTPMOD32: - return REL_DTPMOD; - case R_ARM_TLS_DTPOFF32: - return REL_DTPOFF; - case R_ARM_TLS_TPOFF32: - return REL_TPOFF; - } - return 0; -} +#define REL_SYMBOLIC R_ARM_ABS32 +#define REL_GOT R_ARM_GLOB_DAT +#define REL_PLT R_ARM_JUMP_SLOT +#define REL_RELATIVE R_ARM_RELATIVE +#define REL_COPY R_ARM_COPY +#define REL_DTPMOD R_ARM_TLS_DTPMOD32 +#define REL_DTPOFF R_ARM_TLS_DTPOFF32 +#define REL_TPOFF R_ARM_TLS_TPOFF32 +//#define REL_TLSDESC R_ARM_TLS_DESC + +#define CRTJMP(pc,sp) __asm__ __volatile__( \ + "mov sp,%1 ; tst %0,#1 ; moveq pc,%0 ; bx %0" : : "r"(pc), "r"(sp) : "memory" ) |