diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-04-26 12:07:31 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-04-26 12:07:31 +0200 |
| commit | 68a31c902a3467b570146ae3726af42619bbfce5 (patch) | |
| tree | 20bbac5e3a37e0d3e69b2f70b557eaf153424ba7 /src | |
| parent | 78e6fbcf07336fc33817b561c7b3cd0ed821d0b4 (diff) | |
| download | box64-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-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; } |