about summary refs log tree commit diff stats
path: root/src/elfs
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-04-14 19:34:43 +0800
committerGitHub <noreply@github.com>2025-04-14 13:34:43 +0200
commit6b2373af93e033019dd1ddd5683f2d866e253d8c (patch)
treed8716018ee1c02a8b4e09e88456d1e2c425d3e40 /src/elfs
parentcf32412f986a5a9c281dda5dc24bf22641a305ed (diff)
downloadbox64-6b2373af93e033019dd1ddd5683f2d866e253d8c.tar.gz
box64-6b2373af93e033019dd1ddd5683f2d866e253d8c.zip
[WOW64] Added non-functional PE build (#2532)
Diffstat (limited to 'src/elfs')
-rw-r--r--src/elfs/elfloader.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/elfs/elfloader.c b/src/elfs/elfloader.c
index c12f29b9..f0ab7320 100644
--- a/src/elfs/elfloader.c
+++ b/src/elfs/elfloader.c
@@ -1918,3 +1918,30 @@ EXPORT void PltResolver64(x64emu_t* emu)
     // jmp to function
     R_RIP = offs;
 }
+
+const char* getAddrFunctionName(uintptr_t addr)
+{
+    static char rets[8][1000];
+    static int idx = 0;
+    char* ret = rets[idx];
+    idx = (idx + 1) & 7;
+    uint64_t sz = 0;
+    uintptr_t start = 0;
+    elfheader_t* elf = FindElfAddress(my_context, addr);
+    const char* symbname = FindNearestSymbolName(elf, (void*)addr, &start, &sz);
+    if (!sz) sz = 0x100; // arbitrary value...
+    if (symbname && addr >= start && (addr < (start + sz) || !sz)) {
+        if (symbname[0] == '\0')
+            sprintf(ret, "%s + 0x%lx + 0x%lx", ElfName(elf), start - (uintptr_t)GetBaseAddress(elf), addr - start);
+        else if (addr == start)
+            sprintf(ret, "%s/%s", ElfName(elf), symbname);
+        else
+            sprintf(ret, "%s/%s + 0x%lx", ElfName(elf), symbname, addr - start);
+    } else {
+        if (elf) {
+            sprintf(ret, "%s + 0x%lx", ElfName(elf), addr - (uintptr_t)GetBaseAddress(elf));
+        } else
+            sprintf(ret, "???");
+    }
+    return ret;
+}
\ No newline at end of file