about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-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;
 }