diff options
author | Rich Felker <dalias@aerifal.cx> | 2015-04-13 02:56:26 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2015-04-13 03:04:42 -0400 |
commit | f3ddd173806fd5c60b3f034528ca24542aecc5b9 (patch) | |
tree | 63cc7432a3c40f011c4818de32ef6257acbf0e73 /arch/sh | |
parent | 385c01112c083eb383d972da45836d497cc0556d (diff) | |
download | musl-f3ddd173806fd5c60b3f034528ca24542aecc5b9.zip musl-f3ddd173806fd5c60b3f034528ca24542aecc5b9.tar.gz musl-f3ddd173806fd5c60b3f034528ca24542aecc5b9.tar.bz2 |
dynamic linker bootstrap overhaul
this overhaul further reduces the amount of arch-specific code needed
by the dynamic linker and removes a number of assumptions, including:
- that symbolic function references inside libc are bound at link time
via the linker option -Bsymbolic-functions.
- that libc functions used by the dynamic linker do not require
access to data symbols.
- that static/internal function calls and data accesses can be made
without performing any relocations, or that arch-specific startup
code handled any such relocations needed.
removing these assumptions paves the way for allowing libc.so itself
to be built with stack protector (among other things), and is achieved
by a three-stage bootstrap process:
1. relative relocations are processed with a flat function.
2. symbolic relocations are processed with no external calls/data.
3. main program and dependency libs are processed with a
fully-functional libc/ldso.
reduction in arch-specific code is achived through the following:
- crt_arch.h, used for generating crt1.o, now provides the entry point
for the dynamic linker too.
- asm is no longer responsible for skipping the beginning of argv[]
when ldso is invoked as a command.
- the functionality previously provided by __reloc_self for heavily
GOT-dependent RISC archs is now the arch-agnostic stage-1.
- arch-specific relocation type codes are mapped directly as macros
rather than via an inline translation function/switch statement.
Diffstat (limited to 'arch/sh')
-rw-r--r-- | arch/sh/crt_arch.h | 28 | ||||
-rw-r--r-- | arch/sh/reloc.h | 36 | ||||
-rw-r--r-- | arch/sh/src/__fpscr_values.c | 2 |
3 files changed, 32 insertions, 34 deletions
diff --git a/arch/sh/crt_arch.h b/arch/sh/crt_arch.h index 5fd39fc..a873ffd 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 aeb02d0..e7e4b38 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 64b458f..374df30 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 }; |