musl/arch/i386/reloc.h

24 lines
722 B
C
Raw Normal View History

#define LDSO_ARCH "i386"
#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" )
introduce new symbol-lookup-free rcrt1/dlstart stage chaining previously, the call into stage 2 was made by looking up the symbol name "__dls2" (which was chosen short to be easy to look up) from the dynamic symbol table. this was no problem for the dynamic linker, since it always exports all its symbols. in the case of the static pie entry point, however, the dynamic symbol table does not contain the necessary symbol unless -rdynamic/-E was used when linking. this linking requirement is a major obstacle both to practical use of static-pie as a nommu binary format (since it greatly enlarges the file) and to upstream toolchain support for static-pie (adding -E to default linking specs is not reasonable). this patch replaces the runtime symbolic lookup with a link-time lookup via an inline asm fragment, which reloc.h is responsible for providing. in this initial commit, the asm is provided only for i386, and the old lookup code is left in place as a fallback for archs that have not yet transitioned. modifying crt_arch.h to pass the stage-2 function pointer as an argument was considered as an alternative, but such an approach would not be compatible with fdpic, where it's impossible to compute function pointers without already having performed relocations. it was also deemed desirable to keep crt_arch.h as simple/minimal as possible. in principle, archs with pc-relative or got-relative addressing of static variables could instead load the stage-2 function pointer from a static volatile object. that does not work for fdpic, and is not safe against reordering on mips-like archs that use got slots even for static functions, but it's a valid on i386 and many others, and could provide a reasonable default implementation in the future.
2015-09-17 06:30:55 +00:00
#define GETFUNCSYM(fp, sym, got) __asm__ ( \
".hidden " #sym "\n" \
" call 1f\n" \
"1: addl $" #sym "-.,(%%esp)\n" \
" pop %0" \
: "=r"(*fp) : : "memory" )