diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-02-15 18:11:57 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-02-15 18:11:57 +0100 |
| commit | c5a6875de940f296932154be434d2864e0652da8 (patch) | |
| tree | 278a857811a6bf1d82c945ec647f6846f4a8e029 /src/wrapped | |
| parent | 549e042e678e0909c1a79325fb406fb0081ccac7 (diff) | |
| download | box64-c5a6875de940f296932154be434d2864e0652da8.tar.gz box64-c5a6875de940f296932154be434d2864e0652da8.zip | |
[ELFLOADER] Huge refactor of elfloader and symbol resolution. Some more cleaning need to be done, but that's a first step (should help #422, #360, #1046 and probably others)
Diffstat (limited to 'src/wrapped')
| -rw-r--r-- | src/wrapped/wrappedgtk3.c | 2 | ||||
| -rw-r--r-- | src/wrapped/wrappedgtkx112.c | 2 | ||||
| -rw-r--r-- | src/wrapped/wrappedlibdl.c | 47 |
3 files changed, 19 insertions, 32 deletions
diff --git a/src/wrapped/wrappedgtk3.c b/src/wrapped/wrappedgtk3.c index 92192fcb..77611a34 100644 --- a/src/wrapped/wrappedgtk3.c +++ b/src/wrapped/wrappedgtk3.c @@ -685,7 +685,7 @@ static void my3_gtk_builder_connect_signals_default(void* builder, void* object, } // Mixing Native and emulated code... the my_g_signal_* function will handle that (GetNativeFnc does) if(!func) - func = (void*)FindGlobalSymbol(my_context->maplib, handler_name, 0, NULL); + func = (void*)FindGlobalSymbol(my_context->maplib, handler_name, 0, NULL, 0); if(!func) { my->g_log("Gtk", 1<<4, "Could not find signal handler '%s'.", handler_name); diff --git a/src/wrapped/wrappedgtkx112.c b/src/wrapped/wrappedgtkx112.c index 4b069d16..39f1b08a 100644 --- a/src/wrapped/wrappedgtkx112.c +++ b/src/wrapped/wrappedgtkx112.c @@ -1034,7 +1034,7 @@ static void my_gtk_builder_connect_signals_custom(void* builder, uintptr_t offs = 0; uintptr_t end = 0; - GetGlobalSymbolStartEnd(my_context->maplib, handler_name, &offs, &end, NULL, -1, NULL, NULL, NULL); + GetGlobalSymbolStartEnd(my_context->maplib, handler_name, &offs, &end, NULL, -1, NULL, 0, NULL); if(!offs) { if (args->module == NULL) args->my->g_log("Gtk", 1<<2 ,"gtk_builder_connect_signals() requires working GModule"); diff --git a/src/wrapped/wrappedlibdl.c b/src/wrapped/wrappedlibdl.c index 48b56e46..f85b007d 100644 --- a/src/wrapped/wrappedlibdl.c +++ b/src/wrapped/wrappedlibdl.c @@ -80,6 +80,7 @@ void RemoveDlopen(library_t** lib, size_t idx) } extern int box64_zoom; +void setupTraceMapLib(lib_t* maplib); // Implementation void* my_dlopen(x64emu_t* emu, void *filename, int flag) { @@ -204,6 +205,7 @@ void* my_dlopen(x64emu_t* emu, void *filename, int flag) my_context->deferredInitCap = old_deferredInitCap; return NULL; } + setupTraceMapLib(tmp->libs[0]->maplib); free_neededlib(tmp); lib = GetLibInternal(rfilename); RunDeferredElfInit(emu); @@ -258,7 +260,7 @@ char* my_dlerror(x64emu_t* emu) KHASH_SET_INIT_INT(libs); // TODO: deepbind is probably not followed correctly here -int recursive_dlsym_lib(kh_libs_t* collection, library_t* lib, const char* rsymbol, uintptr_t *start, uintptr_t *end, int version, const char* vername, const char* globdefver, const char* weakdefver) +int recursive_dlsym_lib(kh_libs_t* collection, library_t* lib, const char* rsymbol, uintptr_t *start, uintptr_t *end, int* version, const char** vername, int* veropt) { if(!lib) return 0; @@ -270,25 +272,26 @@ int recursive_dlsym_lib(kh_libs_t* collection, library_t* lib, const char* rsymb // TODO: should use librarian functions instead! int weak; // look in the library itself - if(lib->getglobal(lib, rsymbol, start, end, 0, &weak, version, vername, 1, globdefver)) + if(lib->getglobal(lib, rsymbol, start, end, 0, &weak, version, vername, 1, veropt, NULL)) return 1; - if(lib->getweak(lib, rsymbol, start, end, 0, &weak, version, vername, 1, weakdefver)) + if(lib->getweak(lib, rsymbol, start, end, 0, &weak, version, vername, 1, veropt, NULL)) return 1; // look in other libs int n = GetNeededLibsN(lib); for (int i=0; i<n; ++i) { library_t *l = GetNeededLib(lib, i); - if(recursive_dlsym_lib(collection, l, rsymbol, start, end, version, vername, globdefver, weakdefver)) + if(recursive_dlsym_lib(collection, l, rsymbol, start, end, version, vername, veropt)) return 1; } return 0; } -int my_dlsym_lib(library_t* lib, const char* rsymbol, uintptr_t *start, uintptr_t *end, int version, const char* vername, const char* globdefver, const char* weakdefver) +int my_dlsym_lib(library_t* lib, const char* rsymbol, uintptr_t *start, uintptr_t *end, int version, const char* vername) { kh_libs_t *collection = kh_init(libs); - int ret = recursive_dlsym_lib(collection, lib, rsymbol, start, end, version, vername, globdefver, weakdefver); + int veropt = 0; + int ret = recursive_dlsym_lib(collection, lib, rsymbol, start, end, &version, &vername, &veropt); kh_destroy(libs, collection); return ret; @@ -306,9 +309,7 @@ void* my_dlsym(x64emu_t* emu, void *handle, void *symbol) printf_dlsym(LOG_DEBUG, "%04d|Call to dlsym(%p, \"%s\")%s", GetTID(), handle, rsymbol, dlsym_error?"":"\n"); if(handle==NULL) { // special case, look globably - const char* globdefver = GetMaplibDefaultVersion(my_context->maplib, NULL, 0, 0, rsymbol); - const char* weakdefver = GetMaplibDefaultVersion(my_context->maplib, NULL, 1, 0, rsymbol); - if(GetGlobalSymbolStartEnd(my_context->maplib, rsymbol, &start, &end, NULL, -1, NULL, globdefver, weakdefver)) { + if(GetGlobalSymbolStartEnd(my_context->maplib, rsymbol, &start, &end, NULL, -1, NULL, 0, NULL)) { printf_dlsym(LOG_NEVER, "%p\n", (void*)start); pthread_mutex_unlock(&mutex); return (void*)start; @@ -322,10 +323,8 @@ void* my_dlsym(x64emu_t* emu, void *handle, void *symbol) } if(handle==(void*)~0LL) { // special case, look globably but no self (RTLD_NEXT) - const char* globdefver = GetMaplibDefaultVersion(my_context->maplib, NULL, 0, 0, rsymbol); - const char* weakdefver = GetMaplibDefaultVersion(my_context->maplib, NULL, 1, 0, rsymbol); elfheader_t *elf = FindElfAddress(my_context, *(uintptr_t*)R_RSP); // use return address to guess "self" - if(GetNoSelfSymbolStartEnd(my_context->maplib, rsymbol, &start, &end, elf, 0, -1, NULL, globdefver, weakdefver)) { + if(GetNoSelfSymbolStartEnd(my_context->maplib, rsymbol, &start, &end, elf, 0, -1, NULL, 0, NULL)) { printf_dlsym(LOG_NEVER, "%p\n", (void*)start); pthread_mutex_unlock(&mutex); return (void*)start; @@ -358,9 +357,7 @@ void* my_dlsym(x64emu_t* emu, void *handle, void *symbol) } if(dl->dllibs[nlib].lib) { int deepbind = GetDeepBind(dl->dllibs[nlib].lib); - const char* globdefver = GetMaplibDefaultVersion(my_context->maplib, (my_context->maplib==dl->dllibs[nlib].lib->maplib)?NULL:dl->dllibs[nlib].lib->maplib, 0, deepbind, rsymbol); - const char* weakdefver = GetMaplibDefaultVersion(my_context->maplib, (my_context->maplib==dl->dllibs[nlib].lib->maplib)?NULL:dl->dllibs[nlib].lib->maplib, 1, deepbind, rsymbol); - if(my_dlsym_lib(dl->dllibs[nlib].lib, rsymbol, &start, &end, -1, NULL, globdefver, weakdefver)==0) { + if(my_dlsym_lib(dl->dllibs[nlib].lib, rsymbol, &start, &end, -1, NULL)==0) { // not found printf_dlsym(LOG_NEVER, "%p\nCall to dlsym(%s, \"%s\") Symbol not found\n", NULL, GetNameLib(dl->dllibs[nlib].lib), rsymbol); printf_log(LOG_DEBUG, " Symbol not found\n"); @@ -373,9 +370,7 @@ void* my_dlsym(x64emu_t* emu, void *handle, void *symbol) } else { // still usefull? // => look globably - const char* globdefver = GetMaplibDefaultVersion(my_context->maplib, NULL, 0, 0, rsymbol); - const char* weakdefver = GetMaplibDefaultVersion(my_context->maplib, NULL, 1, 0, rsymbol); - if(GetGlobalSymbolStartEnd(my_context->maplib, rsymbol, &start, &end, NULL, -1, NULL, globdefver, weakdefver)) { + if(GetGlobalSymbolStartEnd(my_context->maplib, rsymbol, &start, &end, NULL, -1, NULL, 0, NULL)) { printf_dlsym(LOG_NEVER, "%p\n", (void*)start); pthread_mutex_unlock(&mutex); return (void*)start; @@ -463,9 +458,7 @@ void* my_dlvsym(x64emu_t* emu, void *handle, void *symbol, const char *vername) printf_dlsym(LOG_DEBUG, "Call to dlvsym(%p, \"%s\", %s)%s", handle, rsymbol, vername?vername:"(nil)", dlsym_error?"":"\n"); if(handle==NULL) { // special case, look globably - const char* globdefver = GetMaplibDefaultVersion(my_context->maplib, NULL, 0, 0, rsymbol); - const char* weakdefver = GetMaplibDefaultVersion(my_context->maplib, NULL, 1, 0, rsymbol); - if(GetGlobalSymbolStartEnd(my_context->maplib, rsymbol, &start, &end, NULL, version, vername, globdefver, weakdefver)) { + if(GetGlobalSymbolStartEnd(my_context->maplib, rsymbol, &start, &end, NULL, version, vername, 0, NULL)) { printf_dlsym(LOG_NEVER, "%p\n", (void*)start); return (void*)start; } @@ -477,10 +470,8 @@ void* my_dlvsym(x64emu_t* emu, void *handle, void *symbol, const char *vername) } if(handle==(void*)~0LL) { // special case, look globably but no self (RTLD_NEXT) - const char* globdefver = GetMaplibDefaultVersion(my_context->maplib, NULL, 0, 0, rsymbol); - const char* weakdefver = GetMaplibDefaultVersion(my_context->maplib, NULL, 1, 0, rsymbol); elfheader_t *elf = FindElfAddress(my_context, *(uintptr_t*)R_RSP); // use return address to guess "self" - if(GetNoSelfSymbolStartEnd(my_context->maplib, rsymbol, &start, &end, elf, 0, version, vername, globdefver, weakdefver)) { + if(GetNoSelfSymbolStartEnd(my_context->maplib, rsymbol, &start, &end, elf, 0, version, vername, 0, NULL)) { printf_dlsym(LOG_NEVER, "%p\n", (void*)start); return (void*)start; } @@ -509,9 +500,7 @@ void* my_dlvsym(x64emu_t* emu, void *handle, void *symbol, const char *vername) } if(dl->dllibs[nlib].lib) { int deepbind = GetDeepBind(dl->dllibs[nlib].lib); - const char* globdefver = GetMaplibDefaultVersion(my_context->maplib, (my_context->maplib==dl->dllibs[nlib].lib->maplib)?NULL:dl->dllibs[nlib].lib->maplib, 0, deepbind, rsymbol); - const char* weakdefver = GetMaplibDefaultVersion(my_context->maplib, (my_context->maplib==dl->dllibs[nlib].lib->maplib)?NULL:dl->dllibs[nlib].lib->maplib, 1, deepbind, rsymbol); - if(my_dlsym_lib(dl->dllibs[nlib].lib, rsymbol, &start, &end, version, vername, globdefver, weakdefver)==0) { + if(my_dlsym_lib(dl->dllibs[nlib].lib, rsymbol, &start, &end, version, vername)==0) { // not found printf_dlsym(LOG_NEVER, "%p\nCall to dlvsym(%s, \"%s\", %s) Symbol not found\n", NULL, GetNameLib(dl->dllibs[nlib].lib), rsymbol, vername?vername:"(nil)"); printf_log(LOG_DEBUG, " Symbol not found\n"); @@ -522,9 +511,7 @@ void* my_dlvsym(x64emu_t* emu, void *handle, void *symbol, const char *vername) } } else { // still usefull? - const char* globdefver = GetMaplibDefaultVersion(my_context->maplib, NULL, 0, 0, rsymbol); - const char* weakdefver = GetMaplibDefaultVersion(my_context->maplib, NULL, 1, 0, rsymbol); - if(GetGlobalSymbolStartEnd(my_context->maplib, rsymbol, &start, &end, NULL, -1, NULL, globdefver, weakdefver)) { + if(GetGlobalSymbolStartEnd(my_context->maplib, rsymbol, &start, &end, NULL, -1, NULL, 0, NULL)) { printf_dlsym(LOG_NEVER, "%p\n", (void*)start); return (void*)start; } |