diff options
Diffstat (limited to 'arch/microblaze')
-rw-r--r-- | arch/microblaze/crt_arch.h | 27 | ||||
-rw-r--r-- | arch/microblaze/reloc.h | 47 |
2 files changed, 25 insertions, 49 deletions
diff --git a/arch/microblaze/crt_arch.h b/arch/microblaze/crt_arch.h index 8917c695..ada98c86 100644 --- a/arch/microblaze/crt_arch.h +++ b/arch/microblaze/crt_arch.h @@ -1,11 +1,16 @@ -__asm__("\ -.global _start \n\ -.align 2 \n\ -_start: \n\ - add r19, r0, r0 \n\ - ori r5, r1, 0 \n\ - andi r1, r1, -8 \n\ - addik r1, r1, -8 \n\ - bri __cstart \n\ - nop \n\ -"); +__asm__( +".global " START " \n" +".align 2 \n" +START ": \n" +" add r19, r0, r0 \n" +" ori r5, r1, 0 \n" +"1: mfs r6, rpc \n" +".weak _DYNAMIC \n" +".hidden _DYNAMIC \n" +" addik r6, r6, _GLOBAL_OFFSET_TABLE_+8 \n" +" addik r6, r6, _DYNAMIC@GOTOFF \n" +" andi r1, r1, -8 \n" +" addik r1, r1, -8 \n" +" bri " START "_c \n" +" nop \n" +); diff --git a/arch/microblaze/reloc.h b/arch/microblaze/reloc.h index 71a6219c..611db465 100644 --- a/arch/microblaze/reloc.h +++ b/arch/microblaze/reloc.h @@ -1,5 +1,3 @@ -#include <string.h> -#include <elf.h> #include <endian.h> #if __BYTE_ORDER == __LITTLE_ENDIAN @@ -12,40 +10,13 @@ #define TPOFF_K 0 -static int remap_rel(int type) -{ - switch(type) { - case R_MICROBLAZE_32: - return REL_SYMBOLIC; - case R_MICROBLAZE_GLOB_DAT: - return REL_GOT; - case R_MICROBLAZE_JUMP_SLOT: - return REL_PLT; - case R_MICROBLAZE_REL: - return REL_RELATIVE; - case R_MICROBLAZE_COPY: - return REL_COPY; - case R_MICROBLAZE_TLSDTPMOD32: - return REL_DTPMOD; - case R_MICROBLAZE_TLSDTPREL32: - return REL_DTPOFF; - } - return 0; -} +#define REL_SYMBOLIC R_MICROBLAZE_32 +#define REL_GOT R_MICROBLAZE_GLOB_DAT +#define REL_PLT R_MICROBLAZE_JUMP_SLOT +#define REL_RELATIVE R_MICROBLAZE_REL +#define REL_COPY R_MICROBLAZE_COPY +#define REL_DTPMOD R_MICROBLAZE_TLSDTPMOD32 +#define REL_DTPOFF R_MICROBLAZE_TLSDTPREL32 -#include "syscall.h" -void __reloc_self(int c, size_t *a, size_t *dynv) -{ - char dot = '.', ex = 'x'; - 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_MICROBLAZE_REL) - *(size_t *)(base+a[0]) = (size_t)base + a[2]; -} +#define CRTJMP(pc,sp) __asm__ __volatile__( \ + "addik r1,%1,0 ; bra %0" : : "r"(pc), "r"(sp) : "memory" ) |