diff --git a/arch/arm/reloc.h b/arch/arm/reloc.h index 4b00bf6..2c2e7f5 100644 --- a/arch/arm/reloc.h +++ b/arch/arm/reloc.h @@ -26,7 +26,9 @@ #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 REL_TLSDESC R_ARM_TLS_DESC + +#define TLSDESC_BACKWARDS #define CRTJMP(pc,sp) __asm__ __volatile__( \ "mov sp,%1 ; bx %0" : : "r"(pc), "r"(sp) : "memory" ) diff --git a/ldso/dynlink.c b/ldso/dynlink.c index 3ecbddf..2293032 100644 --- a/ldso/dynlink.c +++ b/ldso/dynlink.c @@ -458,6 +458,11 @@ static void do_relocs(struct dso *dso, size_t *rel, size_t rel_size, size_t stri + addend; #endif } +#ifdef TLSDESC_BACKWARDS + size_t tmp = reloc_addr[0]; + reloc_addr[0] = reloc_addr[1]; + reloc_addr[1] = tmp; +#endif break; default: error("Error relocating %s: unsupported relocation type %d",