From 039d3c34f2e3578a8b7ada42f89213b844aa7a4e Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Mon, 6 Nov 2023 21:48:02 -0500 Subject: ldso: convert TLSDESC_BACKWARDS from "#ifdef" to "if" logic this style is preferred because it allows the code to be compile-checked even on archs where it is not used. --- arch/arm/reloc.h | 2 +- ldso/dynlink.c | 10 +++++----- src/internal/dynlink.h | 4 ++++ 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/arch/arm/reloc.h b/arch/arm/reloc.h index d091d2ad..d98eb8af 100644 --- a/arch/arm/reloc.h +++ b/arch/arm/reloc.h @@ -26,7 +26,7 @@ #define REL_TPOFF R_ARM_TLS_TPOFF32 #define REL_TLSDESC R_ARM_TLS_DESC -#define TLSDESC_BACKWARDS +#define TLSDESC_BACKWARDS 1 #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 bb02cd3c..6ba51b0a 100644 --- a/ldso/dynlink.c +++ b/ldso/dynlink.c @@ -542,13 +542,13 @@ static void do_relocs(struct dso *dso, size_t *rel, size_t rel_size, size_t stri + addend; #endif } -#ifdef TLSDESC_BACKWARDS /* Some archs (32-bit ARM at least) invert the order of * the descriptor members. Fix them up here. */ - size_t tmp = reloc_addr[0]; - reloc_addr[0] = reloc_addr[1]; - reloc_addr[1] = tmp; -#endif + if (TLSDESC_BACKWARDS) { + size_t tmp = reloc_addr[0]; + reloc_addr[0] = reloc_addr[1]; + reloc_addr[1] = tmp; + } break; default: error("Error relocating %s: unsupported relocation type %d", diff --git a/src/internal/dynlink.h b/src/internal/dynlink.h index 06f41d09..40c743e2 100644 --- a/src/internal/dynlink.h +++ b/src/internal/dynlink.h @@ -73,6 +73,10 @@ struct fdpic_dummy_loadmap { #define DL_NOMMU_SUPPORT 0 #endif +#ifndef TLSDESC_BACKWARDS +#define TLSDESC_BACKWARDS 0 +#endif + #if !DL_FDPIC #define IS_RELATIVE(x,s) ( \ (R_TYPE(x) == REL_RELATIVE) || \ -- cgit v1.2.1