about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-04-26 12:07:31 +0200
committerptitSeb <sebastien.chev@gmail.com>2023-04-26 12:07:31 +0200
commit68a31c902a3467b570146ae3726af42619bbfce5 (patch)
tree20bbac5e3a37e0d3e69b2f70b557eaf153424ba7 /src
parent78e6fbcf07336fc33817b561c7b3cd0ed821d0b4 (diff)
downloadbox64-68a31c902a3467b570146ae3726af42619bbfce5.tar.gz
box64-68a31c902a3467b570146ae3726af42619bbfce5.zip
Added 1st implementation for _dl_find_object (for #742 and #711, maybe #487, #465, #410 and #210 too)
Diffstat (limited to 'src')
-rwxr-xr-xsrc/librarian/library.c12
-rwxr-xr-xsrc/librarian/library_private.h1
-rwxr-xr-xsrc/wrapped/wrappedlibdl.c14
3 files changed, 25 insertions, 2 deletions
diff --git a/src/librarian/library.c b/src/librarian/library.c
index 4c7995a7..4f9c95c8 100755
--- a/src/librarian/library.c
+++ b/src/librarian/library.c
@@ -982,6 +982,16 @@ linkmap_t* getLinkMapLib(library_t* lib)
     }
     return NULL;
 }
+linkmap_t* getLinkMapElf(elfheader_t* h)
+{
+    linkmap_t* lm = my_context->linkmap;
+    while(lm) {
+        if(lm->l_lib && lm->l_lib->type==LIB_EMULATED && lm->l_lib->e.elf == h)
+            return lm;
+        lm = lm->l_next;
+    }
+    return NULL;
+}
 linkmap_t* addLinkMapLib(library_t* lib)
 {
     if(!my_context->linkmap) {
@@ -1062,7 +1072,7 @@ void add1lib_neededlib(needed_libs_t* needed, library_t* lib, const char* name)
     needed->libs = (library_t**)realloc(needed->libs, needed->cap*sizeof(library_t*));
     needed->names = (char**)realloc(needed->names, needed->cap*sizeof(char*));
     needed->libs[needed->size] = lib;
-    needed->names[needed->size] = name;
+    needed->names[needed->size] = (char*)name;
     needed->size++;
 }
 needed_libs_t* copy_neededlib(needed_libs_t* needed)
diff --git a/src/librarian/library_private.h b/src/librarian/library_private.h
index d50da99e..27d3fef6 100755
--- a/src/librarian/library_private.h
+++ b/src/librarian/library_private.h
@@ -109,6 +109,7 @@ typedef struct linkmap_s {
 } linkmap_t;
 
 linkmap_t* getLinkMapLib(library_t* lib);
+linkmap_t* getLinkMapElf(elfheader_t* h);
 linkmap_t* addLinkMapLib(library_t* lib);
 void removeLinkMapLib(library_t* lib);
 
diff --git a/src/wrapped/wrappedlibdl.c b/src/wrapped/wrappedlibdl.c
index 34df9340..9caaba56 100755
--- a/src/wrapped/wrappedlibdl.c
+++ b/src/wrapped/wrappedlibdl.c
@@ -541,7 +541,19 @@ typedef struct my_dl_find_object_s {
 
 EXPORT int my__dl_find_object(x64emu_t* emu, void* addr, my_dl_find_object_t* result)
 {
-    printf_log(LOG_INFO, "Unimplemented _dl_find_object called\n");
+    //printf_log(LOG_INFO, "Unimplemented _dl_find_object called\n");
+    uintptr_t start=0, sz=0;
+    elfheader_t* h = FindElfAddress(my_context, (uintptr_t)addr);
+    if(h) {
+        // find an actual elf
+        const char* name = FindNearestSymbolName(h, addr, &start, &sz);
+        result->dlfo_map_start = (void*)start;
+        result->dlfo_map_end = (void*)(start+sz-1);
+        result->dlfo_eh_frame = (void*)(h->ehframehdr+h->delta);
+        result->dlfo_flags = 0;   // unused it seems
+        result->dlf_link_map = (struct link_map *)getLinkMapElf(h);
+        return 0;
+    }
     return -1;
 }