mirror of
git://git.musl-libc.org/musl
synced 2024-12-26 00:22:35 +00:00
610c5a8524
In TLS variant I the TLS is above TP (or above a fixed offset from TP) but on some targets there is a reserved gap above TP before TLS starts. This matters for the local-exec tls access model when the offsets of TLS variables from the TP are hard coded by the linker into the executable, so the libc must compute these offsets the same way as the linker. The tls offset of the main module has to be alignup(GAP_ABOVE_TP, main_tls_align). If there is no TLS in the main module then the gap can be ignored since musl does not use it and the tls access models of shared libraries are not affected. The previous setup only worked if (tls_align & -GAP_ABOVE_TP) == 0 (i.e. TLS did not require large alignment) because the gap was treated as a fixed offset from TP. Now the TP points at the end of the pthread struct (which is aligned) and there is a gap above it (which may also need alignment). The fix required changing TP_ADJ and __pthread_self on affected targets (aarch64, arm and sh) and in the tlsdesc asm the offset to access the dtv changed too.
55 lines
1.4 KiB
C
55 lines
1.4 KiB
C
#include <endian.h>
|
|
|
|
#if __BYTE_ORDER == __BIG_ENDIAN
|
|
#define ENDIAN_SUFFIX "eb"
|
|
#else
|
|
#define ENDIAN_SUFFIX ""
|
|
#endif
|
|
|
|
#if __SH_FPU_ANY__ || __SH4__
|
|
#define FP_SUFFIX ""
|
|
#else
|
|
#define FP_SUFFIX "-nofpu"
|
|
#endif
|
|
|
|
#if __SH_FDPIC__
|
|
#define ABI_SUFFIX "-fdpic"
|
|
#else
|
|
#define ABI_SUFFIX ""
|
|
#endif
|
|
|
|
#define LDSO_ARCH "sh" ENDIAN_SUFFIX FP_SUFFIX ABI_SUFFIX
|
|
|
|
#define TPOFF_K 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 DL_NOMMU_SUPPORT 1
|
|
|
|
#if __SH_FDPIC__
|
|
#define REL_FUNCDESC R_SH_FUNCDESC
|
|
#define REL_FUNCDESC_VAL R_SH_FUNCDESC_VALUE
|
|
#undef REL_RELATIVE
|
|
#define DL_FDPIC 1
|
|
#define FDPIC_CONSTDISP_FLAG 0x100
|
|
#define CRTJMP(pc,sp) do { \
|
|
register size_t r8 __asm__("r8") = ((size_t *)(sp))[-2]; \
|
|
__asm__ __volatile__( "jmp @%0 ; mov %1,r15" \
|
|
: : "r"(pc), "r"(sp), "r"(r8) : "memory" ); } while(0)
|
|
#define GETFUNCSYM(fp, sym, got) __asm__ ( \
|
|
"mov.l 1f,%0 ; add %1,%0 ; bra 2f ; nop ; .align 2 \n" \
|
|
"1: .long " #sym "@GOTOFFFUNCDESC \n2:" \
|
|
: "=&r"(*fp) : "r"(got) : "memory" )
|
|
#else
|
|
#define CRTJMP(pc,sp) __asm__ __volatile__( \
|
|
"jmp @%0 ; mov %1,r15" : : "r"(pc), "r"(sp) : "memory" )
|
|
#endif
|