about summary refs log tree commit diff
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/aarch64/crt_arch.h13
-rw-r--r--arch/aarch64/reloc.h38
-rw-r--r--arch/arm/crt_arch.h25
-rw-r--r--arch/arm/reloc.h36
-rw-r--r--arch/i386/crt_arch.h29
-rw-r--r--arch/i386/reloc.h45
-rw-r--r--arch/microblaze/crt_arch.h27
-rw-r--r--arch/microblaze/reloc.h47
-rw-r--r--arch/mips/crt_arch.h49
-rw-r--r--arch/mips/reloc.h78
-rw-r--r--arch/or1k/crt_arch.h28
-rw-r--r--arch/or1k/reloc.h54
-rw-r--r--arch/powerpc/crt_arch.h31
-rw-r--r--arch/powerpc/reloc.h51
-rw-r--r--arch/sh/crt_arch.h28
-rw-r--r--arch/sh/reloc.h36
-rw-r--r--arch/sh/src/__fpscr_values.c2
-rw-r--r--arch/x32/crt_arch.h21
-rw-r--r--arch/x32/reloc.h48
-rw-r--r--arch/x86_64/crt_arch.h21
-rw-r--r--arch/x86_64/reloc.h43
21 files changed, 285 insertions, 465 deletions
diff --git a/arch/aarch64/crt_arch.h b/arch/aarch64/crt_arch.h
index 32066881..3a4b321e 100644
--- a/arch/aarch64/crt_arch.h
+++ b/arch/aarch64/crt_arch.h
@@ -1,9 +1,14 @@
 __asm__(
-".global _start\n"
-".type _start,%function\n"
-"_start:\n"
+".global " START "\n"
+".type " START ",%function\n"
+START ":\n"
 "	mov x29, #0\n"
 "	mov x30, #0\n"
 "	mov x0, sp\n"
+".weak _DYNAMIC\n"
+".hidden _DYNAMIC\n"
+"	adrp x1, _DYNAMIC\n"
+"	add x1, x1, #:lo12:_DYNAMIC\n"
 "	and sp, x0, #-16\n"
-"	b __cstart\n");
+"	b " START "_c\n"
+);
diff --git a/arch/aarch64/reloc.h b/arch/aarch64/reloc.h
index e95ae9a8..1b0402bc 100644
--- a/arch/aarch64/reloc.h
+++ b/arch/aarch64/reloc.h
@@ -1,5 +1,3 @@
-#include <string.h>
-#include <elf.h>
 #include <endian.h>
 
 #if __BYTE_ORDER == __BIG_ENDIAN
@@ -14,27 +12,15 @@
 
 #define TPOFF_K 16
 
-static int remap_rel(int type)
-{
-	switch(type) {
-	case R_AARCH64_ABS64:
-		return REL_SYMBOLIC;
-	case R_AARCH64_GLOB_DAT:
-		return REL_GOT;
-	case R_AARCH64_JUMP_SLOT:
-		return REL_PLT;
-	case R_AARCH64_RELATIVE:
-		return REL_RELATIVE;
-	case R_AARCH64_COPY:
-		return REL_COPY;
-	case R_AARCH64_TLS_DTPMOD64:
-		return REL_DTPMOD;
-	case R_AARCH64_TLS_DTPREL64:
-		return REL_DTPOFF;
-	case R_AARCH64_TLS_TPREL64:
-		return REL_TPOFF;
-	case R_AARCH64_TLSDESC:
-		return REL_TLSDESC;
-	}
-	return 0;
-}
+#define REL_SYMBOLIC    R_AARCH64_ABS64
+#define REL_GOT         R_AARCH64_GLOB_DAT
+#define REL_PLT         R_AARCH64_JUMP_SLOT
+#define REL_RELATIVE    R_AARCH64_RELATIVE
+#define REL_COPY        R_AARCH64_COPY
+#define REL_DTPMOD      R_AARCH64_TLS_DTPMOD64
+#define REL_DTPOFF      R_AARCH64_TLS_DTPREL64
+#define REL_TPOFF       R_AARCH64_TLS_TPREL64
+#define REL_TLSDESC     R_AARCH64_TLSDESC
+
+#define CRTJMP(pc,sp) __asm__ __volatile__( \
+	"mov sp,%1 ; bx %0" : : "r"(pc), "r"(sp) : "memory" )
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" )
diff --git a/arch/i386/crt_arch.h b/arch/i386/crt_arch.h
index ae694f99..43c8477a 100644
--- a/arch/i386/crt_arch.h
+++ b/arch/i386/crt_arch.h
@@ -1,13 +1,16 @@
-__asm__("\
-.text \n\
-.global _start \n\
-_start: \n\
-	xor %ebp,%ebp \n\
-	mov %esp,%eax \n\
-	and $-16,%esp \n\
-	push %eax \n\
-	push %eax \n\
-	push %eax \n\
-	push %eax \n\
-	call __cstart \n\
-");
+__asm__(
+".text\n"
+".weak _DYNAMIC \n"
+".hidden _DYNAMIC \n"
+".global " START "\n"
+START ":\n"
+"	xor %ebp,%ebp \n"
+"	mov %esp,%eax \n"
+"	and $-16,%esp \n"
+"	push %eax \n"
+"	push %eax \n"
+"	call 1f \n"
+"1:	addl $_DYNAMIC-1b,(%esp) \n"
+"	push %eax \n"
+"	call " START "_c \n"
+);
diff --git a/arch/i386/reloc.h b/arch/i386/reloc.h
index eaf5aae0..b52ef402 100644
--- a/arch/i386/reloc.h
+++ b/arch/i386/reloc.h
@@ -1,33 +1,16 @@
-#include <string.h>
-#include <elf.h>
-
 #define LDSO_ARCH "i386"
 
-static int remap_rel(int type)
-{
-	switch(type) {
-	case R_386_32:
-		return REL_SYMBOLIC;
-	case R_386_PC32:
-		return REL_OFFSET;
-	case R_386_GLOB_DAT:
-		return REL_GOT;
-	case R_386_JMP_SLOT:
-		return REL_PLT;
-	case R_386_RELATIVE:
-		return REL_RELATIVE;
-	case R_386_COPY:
-		return REL_COPY;
-	case R_386_TLS_DTPMOD32:
-		return REL_DTPMOD;
-	case R_386_TLS_DTPOFF32:
-		return REL_DTPOFF;
-	case R_386_TLS_TPOFF:
-		return REL_TPOFF;
-	case R_386_TLS_TPOFF32:
-		return REL_TPOFF_NEG;
-	case R_386_TLS_DESC:
-		return REL_TLSDESC;
-	}
-	return 0;
-}
+#define REL_SYMBOLIC    R_386_32
+#define REL_OFFSET      R_386_PC32
+#define REL_GOT         R_386_GLOB_DAT
+#define REL_PLT         R_386_JMP_SLOT
+#define REL_RELATIVE    R_386_RELATIVE
+#define REL_COPY        R_386_COPY
+#define REL_DTPMOD      R_386_TLS_DTPMOD32
+#define REL_DTPOFF      R_386_TLS_DTPOFF32
+#define REL_TPOFF       R_386_TLS_TPOFF
+#define REL_TPOFF_NEG   R_386_TLS_TPOFF32
+#define REL_TLSDESC     R_386_TLS_DESC
+
+#define CRTJMP(pc,sp) __asm__ __volatile__( \
+	"mov %1,%%esp ; jmp *%0" : : "r"(pc), "r"(sp) : "memory" )
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" )
diff --git a/arch/mips/crt_arch.h b/arch/mips/crt_arch.h
index d4ae52d1..33bde4e6 100644
--- a/arch/mips/crt_arch.h
+++ b/arch/mips/crt_arch.h
@@ -1,21 +1,28 @@
-__asm__("\n\
-.set push\n\
-.set noreorder\n\
-.global __start\n\
-.global _start\n\
-.type   __start, @function\n\
-.type   _start, @function\n\
-__start:\n\
-_start:\n\
-	bal 1f \n\
-	move $fp, $0 \n\
-2:	.gpword 2b \n\
-1:	lw $gp, 0($ra) \n\
-	subu $gp, $ra, $gp \n\
-	move $4, $sp \n\
-	subu $sp, $sp, 16 \n\
-	and $sp, $sp, -8 \n\
-	lw $25, %call16(__cstart)($gp) \n\
-	jalr $25 \n\
-	nop \n\
-.set pop");
+__asm__(
+".set push\n"
+".set noreorder\n"
+".global _" START "\n"
+".global " START "\n"
+".type   _" START ", @function\n"
+".type   " START ", @function\n"
+"_" START ":\n"
+"" START ":\n"
+"	bal 1f \n"
+"	 move $fp, $0 \n"
+"2:	.gpword 2b \n"
+	.gpword " START "_c \n"
+".weak _DYNAMIC \n"
+".hidden _DYNAMIC \n"
+"	.gpword _DYNAMIC \n"
+"1:	lw $gp, 0($ra) \n"
+"	subu $gp, $ra, $gp \n"
+"	move $4, $sp \n"
+"	lw $5, 8($ra) \n"
+"	addu $5, $5, $gp \n"
+"	lw $25, 4($ra) \n"
+"	addu $25, $25, $gp \n"
+"	subu $sp, $sp, 16 \n"
+"	jalr $25 \n"
+"	 and $sp, $sp, -8 \n"
+".set pop \n"
+);
diff --git a/arch/mips/reloc.h b/arch/mips/reloc.h
index 4b81d328..8aa02852 100644
--- a/arch/mips/reloc.h
+++ b/arch/mips/reloc.h
@@ -1,5 +1,3 @@
-#include <string.h>
-#include <elf.h>
 #include <endian.h>
 
 #if __BYTE_ORDER == __LITTLE_ENDIAN
@@ -18,72 +16,16 @@
 
 #define TPOFF_K (-0x7000)
 
-static int remap_rel(int type)
-{
-	switch(type) {
-	case R_MIPS_REL32:
-		return REL_SYM_OR_REL;
-	case R_MIPS_JUMP_SLOT:
-		return REL_PLT;
-	case R_MIPS_COPY:
-		return REL_COPY;
-	case R_MIPS_TLS_DTPMOD32:
-		return REL_DTPMOD;
-	case R_MIPS_TLS_DTPREL32:
-		return REL_DTPOFF;
-	case R_MIPS_TLS_TPREL32:
-		return REL_TPOFF;
-	}
-	return 0;
-}
+#define REL_SYM_OR_REL  R_MIPS_REL32
+#define REL_PLT         R_MIPS_JUMP_SLOT
+#define REL_COPY        R_MIPS_COPY
+#define REL_DTPMOD      R_MIPS_TLS_DTPMOD32
+#define REL_DTPOFF      R_MIPS_TLS_DTPREL32
+#define REL_TPOFF       R_MIPS_TLS_TPREL32
 
-void __reloc_self(int c, size_t *a, size_t *dynv, size_t *got)
-{
-	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-0x70000000UL<20) t[*a&31] = a[1];
-	n = t[DT_MIPS_LOCAL_GOTNO - 0x70000000];
-	for (a=got; n; a++, n--) *a += (size_t)base;
-}
-
-static void do_relocs(struct dso *dso, size_t *rel, size_t rel_size, size_t stride);
-
-static void do_arch_relocs(struct dso *this, struct dso *head)
-{
-	unsigned char *base = this->base;
-	size_t *dynv = this->dynv;
-	size_t dyn[20] = {0};
-	size_t i;
-	size_t rel[2], got=0;
-	Sym *sym;
-
-	for (i=0; dynv[i]; i+=2) {
-		if (dynv[i]-0x70000000UL<20)
-			dyn[dynv[i]&31] = dynv[i+1];
-		else if (dynv[i] == DT_PLTGOT)
-			got = dynv[i+1];
-	}
-	i = dyn[DT_MIPS_LOCAL_GOTNO-0x70000000];
-	if (this->shortname && !strcmp(this->shortname, "libc.so")) {
-		got += sizeof(size_t) * i;
-	} else {
-		for (; i; i--, got+=sizeof(size_t))
-			*(size_t *)(base+got) += (size_t)base;
-	}
-	sym = this->syms + dyn[DT_MIPS_GOTSYM-0x70000000];
-	i = dyn[DT_MIPS_SYMTABNO-0x70000000] - dyn[DT_MIPS_GOTSYM-0x70000000];
-	for (; i; i--, got+=sizeof(size_t), sym++) {
-		rel[0] = got;
-		rel[1] = sym-this->syms << 8 | R_MIPS_JUMP_SLOT;
-		*(size_t *)(base+got) = 0;
-		do_relocs(this, rel, sizeof rel, 2);
-	}
-}
-
-#define NEED_ARCH_RELOCS 1
+#define NEED_MIPS_GOT_RELOCS 1
 #define DYNAMIC_IS_RO 1
 #define ARCH_SYM_REJECT_UND(s) (!((s)->st_other & STO_MIPS_PLT))
+
+#define CRTJMP(pc,sp) __asm__ __volatile__( \
+	"move $sp,%1 ; jr %0" : : "r"(pc), "r"(sp) : "memory" )
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" )
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" )
diff --git a/arch/sh/crt_arch.h b/arch/sh/crt_arch.h
index 5fd39fc6..a873ffdb 100644
--- a/arch/sh/crt_arch.h
+++ b/arch/sh/crt_arch.h
@@ -1,12 +1,22 @@
-__asm__("\
-.global _start \n\
-_start: \n\
-	mov r15, r4 \n\
-	mov #-16, r0 \n\
-	and r0, r15 \n\
-	bsr __cstart \n\
-	nop \n\
-");
+__asm__(
+".global " START " \n"
+START ": \n"
+"	mova 1f, r0 \n"
+"	mov.l 1f, r5 \n"
+"	add r0, r5 \n"
+"	mov r15, r4 \n"
+"	mov #-16, r0 \n"
+"	and r0, r15 \n"
+"	bsr " START "_c \n"
+"	nop \n"
+".align 2 \n"
+".weak _DYNAMIC \n"
+".hidden _DYNAMIC \n"
+"1:	.long _DYNAMIC-. \n"
+);
 
 /* used by gcc for switching the FPU between single and double precision */
+#ifdef SHARED
+__attribute__((__visibility__("hidden")))
+#endif
 const unsigned long __fpscr_values[2] = { 0, 0x80000 };
diff --git a/arch/sh/reloc.h b/arch/sh/reloc.h
index aeb02d05..e7e4b38f 100644
--- a/arch/sh/reloc.h
+++ b/arch/sh/reloc.h
@@ -8,27 +8,15 @@
 
 #define TPOFF_K 8
 
-static int remap_rel(int type)
-{
-	switch(type) {
-	case R_SH_DIR32:
-		return REL_SYMBOLIC;
-	case R_SH_REL32:
-		return REL_OFFSET;
-	case R_SH_GLOB_DAT:
-		return REL_GOT;
-	case R_SH_JMP_SLOT:
-		return REL_PLT;
-	case R_SH_RELATIVE:
-		return REL_RELATIVE;
-	case R_SH_COPY:
-		return REL_COPY;
-	case R_SH_TLS_DTPMOD32:
-		return REL_DTPMOD;
-	case R_SH_TLS_DTPOFF32:
-		return REL_DTPOFF;
-	case R_SH_TLS_TPOFF32:
-		return REL_TPOFF;
-	}
-	return 0;
-}
+#define REL_SYMBOLIC    R_SH_DIR32
+#define REL_OFFSET      R_SH_REL32
+#define REL_GOT         R_SH_GLOB_DAT
+#define REL_PLT         R_SH_JMP_SLOT
+#define REL_RELATIVE    R_SH_RELATIVE
+#define REL_COPY        R_SH_COPY
+#define REL_DTPMOD      R_SH_TLS_DTPMOD32
+#define REL_DTPOFF      R_SH_TLS_DTPOFF32
+#define REL_TPOFF       R_SH_TLS_TPOFF32
+
+#define CRTJMP(pc,sp) __asm__ __volatile__( \
+	"jmp @%0 ; mov %1,r15" : : "r"(pc), "r"(sp) : "memory" )
diff --git a/arch/sh/src/__fpscr_values.c b/arch/sh/src/__fpscr_values.c
index 64b458f9..374df30e 100644
--- a/arch/sh/src/__fpscr_values.c
+++ b/arch/sh/src/__fpscr_values.c
@@ -1,5 +1,5 @@
 #include "libc.h"
 
 /* used by gcc for switching the FPU between single and double precision */
-const unsigned long __fpscr_values[2] ATTR_LIBC_VISIBILITY = { 0, 0x80000 };
+//const unsigned long __fpscr_values[2] ATTR_LIBC_VISIBILITY = { 0, 0x80000 };
 
diff --git a/arch/x32/crt_arch.h b/arch/x32/crt_arch.h
index db692950..3eec61bd 100644
--- a/arch/x32/crt_arch.h
+++ b/arch/x32/crt_arch.h
@@ -1,9 +1,12 @@
-__asm__("\
-.text \n\
-.global _start \n\
-_start: \n\
-	xor %rbp,%rbp \n\
-	mov %rsp,%rdi \n\
-	andq $-16,%rsp \n\
-	call __cstart \n\
-");
+__asm__(
+".text \n"
+".global " START " \n"
+START ": \n"
+"	xor %rbp,%rbp \n"
+"	mov %rsp,%rdi \n"
+".weak _DYNAMIC \n"
+".hidden _DYNAMIC \n"
+"	lea _DYNAMIC(%rip),%rsi \n"
+"	andq $-16,%rsp \n"
+"	call " START "_c \n"
+);
diff --git a/arch/x32/reloc.h b/arch/x32/reloc.h
index fcfbf99e..7c72d266 100644
--- a/arch/x32/reloc.h
+++ b/arch/x32/reloc.h
@@ -1,7 +1,3 @@
-#include <stdint.h>
-#include <string.h>
-#include <elf.h>
-
 #define LDSO_ARCH "x32"
 
 /* FIXME: x32 is very strange in its use of 64-bit relocation types in
@@ -11,30 +7,20 @@
  * checked. In particular, R_X86_64_64, R_X86_64_DTPOFF64, and
  * R_X86_64_TPOFF64 may need checking. */
 
-static int remap_rel(int type)
-{
-	switch(type) {
-	case R_X86_64_64:
-	case R_X86_64_32:
-		return REL_SYMBOLIC;
-	case R_X86_64_PC32:
-		return REL_OFFSET;
-	case R_X86_64_GLOB_DAT:
-		return REL_GOT;
-	case R_X86_64_JUMP_SLOT:
-		return REL_PLT;
-	case R_X86_64_RELATIVE:
-		return REL_RELATIVE;
-	case R_X86_64_COPY:
-		return REL_COPY;
-	case R_X86_64_DTPMOD64:
-		return REL_DTPMOD;
-	case R_X86_64_DTPOFF64:
-	case R_X86_64_DTPOFF32:
-		return REL_DTPOFF;
-	case R_X86_64_TPOFF64:
-	case R_X86_64_TPOFF32:
-		return REL_TPOFF;
-	}
-	return 0;
-}
+/* The R_X86_64_64, R_X86_64_DTPOFF32, and R_X86_64_TPOFF32 reloc types
+ * were previously mapped in the switch table form of this file; however,
+ * they do not seem to be used/usable for anything. If needed, new
+ * mappings will have to be added. */
+
+#define REL_SYMBOLIC    R_X86_64_32
+#define REL_OFFSET      R_X86_64_PC32
+#define REL_GOT         R_X86_64_GLOB_DAT
+#define REL_PLT         R_X86_64_JUMP_SLOT
+#define REL_RELATIVE    R_X86_64_RELATIVE
+#define REL_COPY        R_X86_64_COPY
+#define REL_DTPMOD      R_X86_64_DTPMOD64
+#define REL_DTPOFF      R_X86_64_DTPOFF64
+#define REL_TPOFF       R_X86_64_TPOFF64
+
+#define CRTJMP(pc,sp) __asm__ __volatile__( \
+	"mov %1,%%esp ; jmp *%0" : : "r"(pc), "r"(sp) : "memory" )
diff --git a/arch/x86_64/crt_arch.h b/arch/x86_64/crt_arch.h
index db692950..3eec61bd 100644
--- a/arch/x86_64/crt_arch.h
+++ b/arch/x86_64/crt_arch.h
@@ -1,9 +1,12 @@
-__asm__("\
-.text \n\
-.global _start \n\
-_start: \n\
-	xor %rbp,%rbp \n\
-	mov %rsp,%rdi \n\
-	andq $-16,%rsp \n\
-	call __cstart \n\
-");
+__asm__(
+".text \n"
+".global " START " \n"
+START ": \n"
+"	xor %rbp,%rbp \n"
+"	mov %rsp,%rdi \n"
+".weak _DYNAMIC \n"
+".hidden _DYNAMIC \n"
+"	lea _DYNAMIC(%rip),%rsi \n"
+"	andq $-16,%rsp \n"
+"	call " START "_c \n"
+);
diff --git a/arch/x86_64/reloc.h b/arch/x86_64/reloc.h
index 9bc58496..84c075c3 100644
--- a/arch/x86_64/reloc.h
+++ b/arch/x86_64/reloc.h
@@ -1,32 +1,15 @@
-#include <stdint.h>
-#include <string.h>
-#include <elf.h>
-
 #define LDSO_ARCH "x86_64"
 
-static int remap_rel(int type)
-{
-	switch(type) {
-	case R_X86_64_64:
-		return REL_SYMBOLIC;
-	case R_X86_64_PC32:
-		return REL_OFFSET32;
-	case R_X86_64_GLOB_DAT:
-		return REL_GOT;
-	case R_X86_64_JUMP_SLOT:
-		return REL_PLT;
-	case R_X86_64_RELATIVE:
-		return REL_RELATIVE;
-	case R_X86_64_COPY:
-		return REL_COPY;
-	case R_X86_64_DTPMOD64:
-		return REL_DTPMOD;
-	case R_X86_64_DTPOFF64:
-		return REL_DTPOFF;
-	case R_X86_64_TPOFF64:
-		return REL_TPOFF;
-	case R_X86_64_TLSDESC:
-		return REL_TLSDESC;
-	}
-	return 0;
-}
+#define REL_SYMBOLIC    R_X86_64_64
+#define REL_OFFSET32    R_X86_64_PC32
+#define REL_GOT         R_X86_64_GLOB_DAT
+#define REL_PLT         R_X86_64_JUMP_SLOT
+#define REL_RELATIVE    R_X86_64_RELATIVE
+#define REL_COPY        R_X86_64_COPY
+#define REL_DTPMOD      R_X86_64_DTPMOD64
+#define REL_DTPOFF      R_X86_64_DTPOFF64
+#define REL_TPOFF       R_X86_64_TPOFF64
+#define REL_TLSDESC     R_X86_64_TLSDESC
+
+#define CRTJMP(pc,sp) __asm__ __volatile__( \
+	"mov %1,%%rsp ; jmp *%0" : : "r"(pc), "r"(sp) : "memory" )