diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-09-16 15:31:46 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-09-16 15:31:46 +0200 |
| commit | 40ac1bca84458c8003fbf13f075dc6d8e594bb04 (patch) | |
| tree | 2e62b5ad456a74320849fad5f72e0c7bfeccd252 /src | |
| parent | bff3b935fb73468d3d1435a5366c6082449a46e9 (diff) | |
| download | box64-40ac1bca84458c8003fbf13f075dc6d8e594bb04.tar.gz box64-40ac1bca84458c8003fbf13f075dc6d8e594bb04.zip | |
[BOX32] Partial handling of wrapped dl_iterate_phdr
Diffstat (limited to 'src')
| -rw-r--r-- | src/elfs/elfloader.c | 8 | ||||
| -rw-r--r-- | src/elfs/elfloader32.c | 35 |
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; +} |