diff options
Diffstat (limited to 'arch/or1k')
| -rw-r--r-- | arch/or1k/crt_arch.h | 28 | ||||
| -rw-r--r-- | arch/or1k/reloc.h | 54 | 
2 files changed, 28 insertions, 54 deletions
| diff --git a/arch/or1k/crt_arch.h b/arch/or1k/crt_arch.h index 0f381d2d..84415561 100644 --- a/arch/or1k/crt_arch.h +++ b/arch/or1k/crt_arch.h @@ -1,11 +1,17 @@ -__asm__("\ -.global _start \n\ -.align  4 \n\ -_start: \n\ -	l.ori r3, r1, 0 \n\ -	l.addi r2, r0, -8 \n\ -	l.and r1, r1, r2 \n\ -	l.addi r1, r1, -8 \n\ -	l.jal __cstart \n\ -	 l.ori r2, r0, 0 \n\ -"); +__asm__( +".global " START " \n" +".align  4 \n" +START ": \n" +"	l.jal 1f \n" +"	 l.ori r3, r1, 0 \n" +".weak _DYNAMIC \n" +".hidden _DYNAMIC \n" +"	.word _DYNAMIC-. \n" +"1:	l.lwz r4, 0(r9) \n" +"	l.add r4, r4, r9 \n" +"	l.addi r2, r0, -8 \n" +"	l.and r1, r1, r2 \n" +"	l.addi r1, r1, -16 \n" +"	l.jal " START "_c \n" +"	 l.ori r2, r0, 0 \n" +); diff --git a/arch/or1k/reloc.h b/arch/or1k/reloc.h index 830a800a..ddee45c5 100644 --- a/arch/or1k/reloc.h +++ b/arch/or1k/reloc.h @@ -1,47 +1,15 @@ -#include <string.h> -#include <elf.h> -#include <endian.h> -  #define LDSO_ARCH "or1k"  #define TPOFF_K 0 -static int remap_rel(int type) -{ -	switch(type) { -	case R_OR1K_32: -		return REL_SYMBOLIC; -	case R_OR1K_GLOB_DAT: -		return REL_GOT; -	case R_OR1K_JMP_SLOT: -		return REL_PLT; -	case R_OR1K_RELATIVE: -		return REL_RELATIVE; -	case R_OR1K_COPY: -		return REL_COPY; -	case R_OR1K_TLS_DTPMOD: -		return REL_DTPMOD; -	case R_OR1K_TLS_DTPOFF: -		return REL_DTPOFF; -	case R_OR1K_TLS_TPOFF: -		return REL_TPOFF; -	} -	return 0; -} - -#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_OR1K_RELATIVE) -			*(size_t *)(base+a[0]) = (size_t)base + a[2]; -} +#define REL_SYMBOLIC    R_OR1K_32 +#define REL_GOT         R_OR1K_GLOB_DAT +#define REL_PLT         R_OR1K_JMP_SLOT +#define REL_RELATIVE    R_OR1K_RELATIVE +#define REL_COPY        R_OR1K_COPY +#define REL_DTPMOD      R_OR1K_TLS_DTPMOD +#define REL_DTPOFF      R_OR1K_TLS_DTPOFF +#define REL_TPOFF       R_OR1K_TLS_TPOFF + +#define CRTJMP(pc,sp) __asm__ __volatile__( \ +	"l.jr %0 ; l.ori r1,%1,0" : : "r"(pc), "r"(sp) : "memory" ) | 
