From b833cb9ea33f1dd0ee5f95bbbe0ffdd9a18127e0 Mon Sep 17 00:00:00 2001 From: jiska Date: Tue, 6 Aug 2024 02:06:47 +0200 Subject: [PATCH] darwin-mapper: Initialize TLV before constructors Constructors may already access thread-local variables, hence we need to initialize these first, before emitting callouts to initializers. --- gum/backend-darwin/gumdarwinmapper.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/gum/backend-darwin/gumdarwinmapper.c b/gum/backend-darwin/gumdarwinmapper.c index 3768a7da3..97081335b 100644 --- a/gum/backend-darwin/gumdarwinmapper.c +++ b/gum/backend-darwin/gumdarwinmapper.c @@ -1171,12 +1171,13 @@ gum_emit_runtime (GumDarwinMapper * self, (GumFoundDarwinBindFunc) gum_emit_resolve_if_needed, &ctx); gum_darwin_module_enumerate_lazy_binds (module, (GumFoundDarwinBindFunc) gum_emit_resolve_if_needed, &ctx); - gum_darwin_module_enumerate_init_pointers (module, - (GumFoundDarwinInitPointersFunc) gum_emit_init_calls, &ctx); if (tlv->num_descriptors != 0) gum_emit_tlv_init_code (&ctx); + gum_darwin_module_enumerate_init_pointers (module, + (GumFoundDarwinInitPointersFunc) gum_emit_init_calls, &ctx); + gum_x86_writer_put_add_reg_imm (&cw, GUM_X86_XSP, self->module->pointer_size); gum_x86_writer_put_pop_reg (&cw, GUM_X86_XBX); gum_x86_writer_put_pop_reg (&cw, GUM_X86_XBP); @@ -1713,14 +1714,15 @@ gum_emit_arm64_runtime (GumDarwinMapper * self, (GumFoundDarwinBindFunc) gum_emit_arm64_resolve_if_needed, &ctx); gum_darwin_module_enumerate_lazy_binds (module, (GumFoundDarwinBindFunc) gum_emit_arm64_resolve_if_needed, &ctx); + + if (tlv->num_descriptors != 0) + gum_emit_arm64_tlv_init_code (&ctx); + gum_darwin_module_enumerate_init_pointers (module, (GumFoundDarwinInitPointersFunc) gum_emit_arm64_init_pointer_calls, &ctx); gum_darwin_module_enumerate_init_offsets (module, (GumFoundDarwinInitOffsetsFunc) gum_emit_arm64_init_offset_calls, &ctx); - if (tlv->num_descriptors != 0) - gum_emit_arm64_tlv_init_code (&ctx); - gum_arm64_writer_put_pop_reg_reg (&aw, ARM64_REG_X21, ARM64_REG_X22); gum_arm64_writer_put_pop_reg_reg (&aw, ARM64_REG_X19, ARM64_REG_X20); gum_arm64_writer_put_pop_reg_reg (&aw, ARM64_REG_FP, ARM64_REG_LR);