|
Message-Id: <20220823184157.42134-1-info@bnoordhuis.nl> Date: Tue, 23 Aug 2022 20:41:57 +0200 From: Ben Noordhuis <info@...ordhuis.nl> To: musl@...ts.openwall.com Cc: Ben Noordhuis <info@...ordhuis.nl> Subject: [PATCH] ldso: add basic ifunc support Not perfect yet because it doesn't handle resolver functions that need relocations themselves but basic functionality works. That is, this works: typedef void (*Func)(void); void f(void) __attribute__((ifunc("g"))); Func g(void) { return h; } void h(void) { abort(); } But returning an extern function does not: typedef void (*Func)(void); void f(void) __attribute__((ifunc("g"))); Func g(void) { return abort; } // segfaults --- arch/x86_64/reloc.h | 1 + ldso/dynlink.c | 4 ++++ src/internal/dynlink.h | 1 + 3 files changed, 6 insertions(+) diff --git a/arch/x86_64/reloc.h b/arch/x86_64/reloc.h index fac0c0ae..fb6be3ea 100644 --- a/arch/x86_64/reloc.h +++ b/arch/x86_64/reloc.h @@ -10,6 +10,7 @@ #define REL_DTPOFF R_X86_64_DTPOFF64 #define REL_TPOFF R_X86_64_TPOFF64 #define REL_TLSDESC R_X86_64_TLSDESC +#define REL_IRELATIVE R_X86_64_IRELATIVE #define CRTJMP(pc,sp) __asm__ __volatile__( \ "mov %1,%%rsp ; jmp *%0" : : "r"(pc), "r"(sp) : "memory" ) diff --git a/ldso/dynlink.c b/ldso/dynlink.c index fd09ca69..659cb113 100644 --- a/ldso/dynlink.c +++ b/ldso/dynlink.c @@ -507,6 +507,10 @@ static void do_relocs(struct dso *dso, size_t *rel, size_t rel_size, size_t stri reloc_addr[1] = tmp; #endif break; + case REL_IRELATIVE: + *reloc_addr = (size_t)base + addend; + *reloc_addr = ((size_t(*)(void))*reloc_addr)(); + break; default: error("Error relocating %s: unsupported relocation type %d", dso->name, type); diff --git a/src/internal/dynlink.h b/src/internal/dynlink.h index 830354eb..c67bc35e 100644 --- a/src/internal/dynlink.h +++ b/src/internal/dynlink.h @@ -41,6 +41,7 @@ enum { REL_TPOFF, REL_TPOFF_NEG, REL_TLSDESC, + REL_IRELATIVE, REL_FUNCDESC, REL_FUNCDESC_VAL, }; -- 2.34.1
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.