about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-09-16 15:31:46 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-09-16 15:31:46 +0200
commit40ac1bca84458c8003fbf13f075dc6d8e594bb04 (patch)
tree2e62b5ad456a74320849fad5f72e0c7bfeccd252 /src
parentbff3b935fb73468d3d1435a5366c6082449a46e9 (diff)
downloadbox64-40ac1bca84458c8003fbf13f075dc6d8e594bb04.tar.gz
box64-40ac1bca84458c8003fbf13f075dc6d8e594bb04.zip
[BOX32] Partial handling of wrapped dl_iterate_phdr
Diffstat (limited to 'src')
-rw-r--r--src/elfs/elfloader.c8
-rw-r--r--src/elfs/elfloader32.c35
2 files changed, 42 insertions, 1 deletions
diff --git a/src/elfs/elfloader.c b/src/elfs/elfloader.c
index 9b09d042..f9a89cd6 100644
--- a/src/elfs/elfloader.c
+++ b/src/elfs/elfloader.c
@@ -1500,8 +1500,14 @@ static void* find_dl_iterate_phdr_Fct(void* fct)
 }
 #undef SUPER
 
+EXPORT int my32_dl_iterate_phdr(x64emu_t *emu, void* F, void *data)
+#ifndef BOX32
+{ }
+#else
+ ;
+#endif
 EXPORT int my_dl_iterate_phdr(x64emu_t *emu, void* F, void *data) {
-    if(box64_is32bits) {printf_log(LOG_NONE, "Error, calling unsuppoeted dl_iterate_phdr in 32bits\n"); return 0; }
+    if(box64_is32bits) return my32_dl_iterate_phdr(emu, F, data);
     printf_log(LOG_DEBUG, "Call to partially implemented dl_iterate_phdr(%p, %p)\n", F, data);
     box64context_t *context = GetEmuContext(emu);
     const char* empty = "";
diff --git a/src/elfs/elfloader32.c b/src/elfs/elfloader32.c
index 4330e5c5..0fdb23e5 100644
--- a/src/elfs/elfloader32.c
+++ b/src/elfs/elfloader32.c
@@ -904,3 +904,38 @@ EXPORT void PltResolver32(x64emu_t* emu)
     // jmp to function
     R_EIP = offs;
 }
+
+
+typedef struct my_dl_phdr_info_32_s {
+    ptr_t           dlpi_addr;  //void*
+    ptr_t           dlpi_name;  //const char*
+    ptr_t           dlpi_phdr;  //Elf32_Phdr*
+    Elf32_Half      dlpi_phnum;
+} my_dl_phdr_info_32_t;
+
+static int dl_iterate_phdr_callback(x64emu_t *emu, void* F, my_dl_phdr_info_32_t *info, size_t size, void* data)
+{
+    int ret = RunFunctionWithEmu(emu, 0, (uintptr_t)F, 3, to_ptrv(info), to_ulong(size), to_ptrv(data));
+    return ret;
+}
+
+EXPORT int my32_dl_iterate_phdr(x64emu_t *emu, void* F, void *data) {
+    printf_log(LOG_DEBUG, "Call to partially implemented 32bits dl_iterate_phdr(%p, %p)\n", F, data);
+    box64context_t *context = GetEmuContext(emu);
+    const char* empty = "";
+    int ret = 0;
+    for (int idx=0; idx<context->elfsize; ++idx) {
+        if(context->elfs[idx]) {
+            static my_dl_phdr_info_32_t info;
+            info.dlpi_addr = to_ptrv(GetElfDelta(context->elfs[idx]));
+            info.dlpi_name = to_ptrv((void*)(idx?context->elfs[idx]->name:empty));    //1st elf is program, and this one doesn't get a name
+            info.dlpi_phdr = to_ptrv(context->elfs[idx]->PHEntries._32);
+            info.dlpi_phnum = context->elfs[idx]->numPHEntries;
+            if((ret = dl_iterate_phdr_callback(emu, F, &info, sizeof(info), data))) {
+                return ret;
+            }
+        }
+    }
+    // not iterationg on native libs
+    return ret;
+}