diff options
| -rwxr-xr-x | src/librarian/library.c | 12 | ||||
| -rwxr-xr-x | src/librarian/library_private.h | 1 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibdl.c | 14 |
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; } |