diff options
42 files changed, 334 insertions, 379 deletions
diff --git a/src/include/box64context.h b/src/include/box64context.h index 5dc2399d..036a2b6d 100755 --- a/src/include/box64context.h +++ b/src/include/box64context.h @@ -136,23 +136,14 @@ typedef struct box64context_s { pthread_mutex_t mutex_bridge; library_t *libclib; // shortcut to libc library (if loaded, so probably yes) - library_t *sdl1lib; // shortcut to SDL1 library (if loaded) - void* sdl1allocrw; - void* sdl1freerw; library_t *sdl1mixerlib; - library_t *sdl2lib; // shortcut to SDL2 library (if loaded) - void* sdl2allocrw; - void* sdl2freerw; + library_t *sdl2lib; library_t *sdl2mixerlib; - library_t *x11lib; - library_t *zlib; - library_t *vorbisfile; - library_t *vorbis; - library_t *asound; - library_t *pulse; - library_t *d3dadapter9; - library_t *libglu; linkmap_t *linkmap; + void* sdl1allocrw; // SDL1 AllocRW/FreeRW function + void* sdl1freerw; + void* sdl2allocrw; // SDL2 AllocRW/FreeRW function + void* sdl2freerw; int deferedInit; elfheader_t **deferedInitList; @@ -166,9 +157,9 @@ typedef struct box64context_s { uintptr_t *auxval_start; - cleanup_t *cleanups; // atexit functions - int clean_sz; - int clean_cap; + cleanup_t *cleanups; // atexit functions + int clean_sz; + int clean_cap; zydis_dec_t *dec; // trace diff --git a/src/include/library.h b/src/include/library.h index 006e61f4..1bd9be3a 100755 --- a/src/include/library.h +++ b/src/include/library.h @@ -10,6 +10,10 @@ typedef struct box64context_s box64context_t; typedef struct x64emu_s x64emu_t; typedef struct needed_libs_s needed_libs_t; +#define LIB_NATIVE 0 +#define LIB_EMULATED 1 +#define LIB_UNNKNOW -1 + library_t *NewLibrary(const char* path, box64context_t* box64); int AddSymbolsLibrary(lib_t* maplib, library_t* lib, x64emu_t* emu); int FinalizeLibrary(library_t* lib, lib_t* local_maplib, int bindnow, x64emu_t* emu); diff --git a/src/include/wrappedlibs.h b/src/include/wrappedlibs.h index 6cb350c4..5ff61939 100755 --- a/src/include/wrappedlibs.h +++ b/src/include/wrappedlibs.h @@ -10,8 +10,8 @@ typedef void (*wrappedlib_fini_t)(library_t * lib); typedef int (*wrappedlib_get_t)(library_t* lib, const char* name, uintptr_t *offs, uintptr_t *sz, int version, const char* vername, int local); void setNeededLibs(library_t* lib, int n, ...); -#define SETALT(A) lib->altmy = strdup(#A) -#define SETALTPREFIX(A) lib->priv.w.altprefix = strdup(A) +#define SETALT(A) lib->w.altmy = strdup(#A) +#define SETALTPREFIX(A) lib->w.altprefix = strdup(A) typedef struct wrappedlib_s { const char* name; diff --git a/src/librarian/librarian.c b/src/librarian/librarian.c index cf5c9400..e871b68e 100755 --- a/src/librarian/librarian.c +++ b/src/librarian/librarian.c @@ -287,7 +287,7 @@ int AddNeededLib_add(lib_t* maplib, needed_libs_t* neededlibs, library_t* deplib return 1; } - if (lib->type == 1) { + if (lib->type == LIB_EMULATED) { // Need to add library to the linkmap (put here so the link is ordered) linkmap_t *lm = addLinkMapLib(lib); if(!lm) { @@ -295,9 +295,9 @@ int AddNeededLib_add(lib_t* maplib, needed_libs_t* neededlibs, library_t* deplib printf_log(LOG_DEBUG, "Failure to add lib linkmap\n"); return 1; } - lm->l_addr = (Elf64_Addr)GetElfDelta(my_context->elfs[lib->priv.n.elf_index]); + lm->l_addr = (Elf64_Addr)GetElfDelta(my_context->elfs[lib->e.elf_index]); lm->l_name = lib->name; - lm->l_ld = GetDynamicSection(my_context->elfs[lib->priv.n.elf_index]); + lm->l_ld = GetDynamicSection(my_context->elfs[lib->e.elf_index]); } return 0; } diff --git a/src/librarian/library.c b/src/librarian/library.c index d12b4d3f..1d6fb4bd 100755 --- a/src/librarian/library.c +++ b/src/librarian/library.c @@ -82,37 +82,37 @@ int NbDot(const char* name) } void NativeLib_CommonInit(library_t *lib) { - lib->priv.w.bridge = NewBridge(); + lib->w.bridge = NewBridge(); - lib->symbolmap = kh_init(symbolmap); - lib->wsymbolmap = kh_init(symbolmap); - lib->mysymbolmap = kh_init(symbolmap); - lib->wmysymbolmap = kh_init(symbolmap); - lib->stsymbolmap = kh_init(symbolmap); - lib->symbol2map = kh_init(symbol2map); - lib->datamap = kh_init(datamap); - lib->wdatamap = kh_init(datamap); - lib->mydatamap = kh_init(datamap); + lib->w.symbolmap = kh_init(symbolmap); + lib->w.wsymbolmap = kh_init(symbolmap); + lib->w.mysymbolmap = kh_init(symbolmap); + lib->w.wmysymbolmap = kh_init(symbolmap); + lib->w.stsymbolmap = kh_init(symbolmap); + lib->w.symbol2map = kh_init(symbol2map); + lib->w.datamap = kh_init(datamap); + lib->w.wdatamap = kh_init(datamap); + lib->w.mydatamap = kh_init(datamap); } void EmuLib_Fini(library_t* lib) { - kh_destroy(mapsymbols, lib->priv.n.mapsymbols); - kh_destroy(mapsymbols, lib->priv.n.localsymbols); + kh_destroy(mapsymbols, lib->e.mapsymbols); + kh_destroy(mapsymbols, lib->e.localsymbols); } void NativeLib_FinishFini(library_t* lib) { - if(lib->priv.w.lib) - dlclose(lib->priv.w.lib); - lib->priv.w.lib = NULL; - if(lib->priv.w.altprefix) - box_free(lib->priv.w.altprefix); - if(lib->priv.w.neededlibs) { - for(int i=0; i<lib->priv.w.needed; ++i) - box_free(lib->priv.w.neededlibs[i]); - box_free(lib->priv.w.neededlibs); + if(lib->w.lib) + dlclose(lib->w.lib); + lib->w.lib = NULL; + if(lib->w.altprefix) + box_free(lib->w.altprefix); + if(lib->w.neededlibs) { + for(int i=0; i<lib->w.needed; ++i) + box_free(lib->w.neededlibs[i]); + box_free(lib->w.neededlibs); } - FreeBridge(&lib->priv.w.bridge); + FreeBridge(&lib->w.bridge); } int WrappedLib_defget(library_t* lib, const char* name, uintptr_t *offs, uintptr_t *sz, int version, const char* vername, int local) { @@ -131,14 +131,14 @@ int EmuLib_Get(library_t* lib, const char* name, uintptr_t *offs, uintptr_t *sz, { // symbols... uintptr_t start, end; - if(GetSymbolStartEnd(lib->priv.n.mapsymbols, name, &start, &end, version, vername, local)) + if(GetSymbolStartEnd(lib->e.mapsymbols, name, &start, &end, version, vername, local)) { *offs = start; *sz = end-start; return 1; } // weak symbols... - if(GetSymbolStartEnd(lib->priv.n.weaksymbols, name, &start, &end, version, vername, local)) + if(GetSymbolStartEnd(lib->e.weaksymbols, name, &start, &end, version, vername, local)) { *offs = start; *sz = end-start; @@ -161,7 +161,7 @@ int WrappedLib_defgetnoweak(library_t* lib, const char* name, uintptr_t *offs, u int EmuLib_GetNoWeak(library_t* lib, const char* name, uintptr_t *offs, uintptr_t *sz, int version, const char* vername, int local) { uintptr_t start, end; - if(GetSymbolStartEnd(lib->priv.n.mapsymbols, name, &start, &end, version, vername, local)) + if(GetSymbolStartEnd(lib->e.mapsymbols, name, &start, &end, version, vername, local)) { *offs = start; *sz = end-start; @@ -172,7 +172,7 @@ int EmuLib_GetNoWeak(library_t* lib, const char* name, uintptr_t *offs, uintptr_ int EmuLib_GetLocal(library_t* lib, const char* name, uintptr_t *offs, uintptr_t *sz, int version, const char* vername, int local) { uintptr_t start, end; - if(GetSymbolStartEnd(lib->priv.n.localsymbols, name, &start, &end, version, vername, local)) + if(GetSymbolStartEnd(lib->e.localsymbols, name, &start, &end, version, vername, local)) { *offs = start; *sz = end-start; @@ -199,15 +199,13 @@ static void initNativeLib(library_t *lib, box64context_t* context) { return; // non blocker... } printf_log(LOG_INFO, "Using native(wrapped) %s\n", lib->name); - lib->priv.w.box64lib = context->box64lib; - lib->context = context; lib->fini = wrappedlibs[i].fini; lib->get = wrappedlibs[i].get; lib->getnoweak = wrappedlibs[i].getnoweak; lib->getlocal = NativeLib_GetLocal; - lib->type = 0; + lib->type = LIB_NATIVE; // Call librarian to load all dependant elf - if(AddNeededLib(context->maplib, &lib->needed, lib, 0, 0, (const char**)lib->priv.w.neededlibs, lib->priv.w.needed, context, thread_get_emu())) { + if(AddNeededLib(context->maplib, &lib->needed, lib, 0, 0, (const char**)lib->w.neededlibs, lib->w.needed, context, thread_get_emu())) { printf_log(LOG_NONE, "Error: loading a needed libs in elf %s\n", lib->name); return; } @@ -219,7 +217,7 @@ static void initNativeLib(library_t *lib, box64context_t* context) { break; } struct link_map real_lm; - if(dlinfo(lib->priv.w.lib, RTLD_DI_LINKMAP, &real_lm)) { + if(dlinfo(lib->w.lib, RTLD_DI_LINKMAP, &real_lm)) { printf_log(LOG_DEBUG, "Failed to dlinfo lib %s\n", lib->name); } lm->l_addr = real_lm.l_addr; @@ -269,15 +267,16 @@ static int loadEmulatedLib(const char* libname, library_t *lib, box64context_t* ElfAttachLib(elf_header, lib); - lib->type = 1; + lib->type = LIB_EMULATED; lib->fini = EmuLib_Fini; lib->get = EmuLib_Get; lib->getnoweak = EmuLib_GetNoWeak; lib->getlocal = EmuLib_GetLocal; - lib->priv.n.elf_index = mainelf; - lib->priv.n.mapsymbols = kh_init(mapsymbols); - lib->priv.n.weaksymbols = kh_init(mapsymbols); - lib->priv.n.localsymbols = kh_init(mapsymbols); + lib->e.elf_index = mainelf; + lib->e.elf = elf_header; + lib->e.mapsymbols = kh_init(mapsymbols); + lib->e.weaksymbols = kh_init(mapsymbols); + lib->e.localsymbols = kh_init(mapsymbols); if(lib->path && strcmp(lib->path, libname)) { box_free(lib->path); @@ -349,8 +348,7 @@ library_t *NewLibrary(const char* path, box64context_t* context) else lib->name = Path2Name(path); lib->nbdot = NbDot(lib->name); - lib->context = context; - lib->type = -1; + lib->type = LIB_UNNKNOW; printf_log(LOG_DEBUG, "Simplified name is \"%s\"\n", lib->name); if(box64_nopulse) { if(strstr(lib->name, "libpulse.so")==lib->name || strstr(lib->name, "libpulse-simple.so")==lib->name) { @@ -383,20 +381,19 @@ library_t *NewLibrary(const char* path, box64context_t* context) if(!notwrapped && !precise) initNativeLib(lib, context); // then look for a native one - if(lib->type==-1) + if(lib->type==LIB_UNNKNOW) initEmulatedLib(path, lib, context); // still not loaded but notwrapped indicated: use wrapped... - if(lib->type==-1 && notwrapped && !precise) + if(lib->type==LIB_UNNKNOW && notwrapped && !precise) initNativeLib(lib, context); // nothing loaded, so error... - if(lib->type==-1) + if(lib->type==LIB_UNNKNOW) { box_free(lib->name); box_free(lib->path); box_free(lib); return NULL; } - lib->bridgemap = kh_init(bridgemap); return lib; @@ -406,10 +403,10 @@ int AddSymbolsLibrary(lib_t *maplib, library_t* lib, x64emu_t* emu) (void)emu; lib->active = 1; - if(lib->type==1) { - elfheader_t *elf_header = lib->context->elfs[lib->priv.n.elf_index]; + if(lib->type==LIB_EMULATED) { + elfheader_t *elf_header = lib->e.elf; // add symbols - AddSymbols(maplib, lib->priv.n.mapsymbols, lib->priv.n.weaksymbols, lib->priv.n.localsymbols, elf_header); + AddSymbols(maplib, lib->e.mapsymbols, lib->e.weaksymbols, lib->e.localsymbols, elf_header); } return 0; } @@ -417,11 +414,11 @@ int FinalizeLibrary(library_t* lib, lib_t* local_maplib, int bindnow, x64emu_t* { if(!lib) return 0; - if(lib->type==1) { - if(lib->priv.n.finalized) + if(lib->type==LIB_EMULATED) { + if(lib->e.finalized) return 0; - lib->priv.n.finalized = 1; - elfheader_t *elf_header = my_context->elfs[lib->priv.n.elf_index]; + lib->e.finalized = 1; + elfheader_t *elf_header = my_context->elfs[lib->e.elf_index]; // finalize relocations if(RelocateElf(my_context->maplib, local_maplib, bindnow, elf_header)) { printf_log(LOG_NONE, "Error: relocating symbols in elf %s\n", lib->name); @@ -454,16 +451,16 @@ int FinalizeLibrary(library_t* lib, lib_t* local_maplib, int bindnow, x64emu_t* int ReloadLibrary(library_t* lib, x64emu_t* emu) { lib->active = 1; - if(lib->type==1) { - elfheader_t *elf_header = lib->context->elfs[lib->priv.n.elf_index]; + if(lib->type==LIB_EMULATED) { + elfheader_t *elf_header = lib->e.elf; // reload image in memory and re-run the mapping char libname[MAX_PATH]; strcpy(libname, lib->path); int found = FileExist(libname, IS_FILE); if(!found && !strchr(lib->path, '/')) - for(int i=0; i<lib->context->box64_ld_lib.size; ++i) + for(int i=0; i<my_context->box64_ld_lib.size; ++i) { - strcpy(libname, lib->context->box64_ld_lib.paths[i]); + strcpy(libname, my_context->box64_ld_lib.paths[i]); strcat(libname, lib->path); if(FileExist(libname, IS_FILE)) break; @@ -477,7 +474,7 @@ int ReloadLibrary(library_t* lib, x64emu_t* emu) printf_log(LOG_NONE, "Error: cannot open file to re-load elf %s (errno=%d/%s)\n", libname, errno, strerror(errno)); return 1; // failed to reload... } - if(ReloadElfMemory(f, lib->context, elf_header)) { + if(ReloadElfMemory(f, my_context, elf_header)) { printf_log(LOG_NONE, "Error: re-loading in memory elf %s\n", libname); fclose(f); return 1; @@ -485,11 +482,11 @@ int ReloadLibrary(library_t* lib, x64emu_t* emu) // can close the file now fclose(f); // should bindnow be store in a per/library basis? - if(RelocateElf(lib->context->maplib, lib->maplib, 0, elf_header)) { + if(RelocateElf(my_context->maplib, lib->maplib, 0, elf_header)) { printf_log(LOG_NONE, "Error: relocating symbols in elf %s\n", lib->name); return 1; } - RelocateElfPlt(lib->context->maplib, lib->maplib, 0, elf_header); + RelocateElfPlt(my_context->maplib, lib->maplib, 0, elf_header); // init (will use PltRelocator... because some other libs are not yet resolved) RunElfInit(elf_header, emu); } @@ -505,15 +502,15 @@ void Free1Library(library_t **lib, x64emu_t* emu) { if(!(*lib)) return; - if((*lib)->type==1 && emu) { - elfheader_t *elf_header = (*lib)->context->elfs[(*lib)->priv.n.elf_index]; + if((*lib)->type==LIB_EMULATED && emu) { + elfheader_t *elf_header = (*lib)->e.elf; RunElfFini(elf_header, emu); } if((*lib)->maplib) FreeLibrarian(&(*lib)->maplib, emu); - if((*lib)->type!=-1 && (*lib)->fini) { + if((*lib)->type!=LIB_UNNKNOW && (*lib)->fini) { (*lib)->fini(*lib); } box_free((*lib)->name); @@ -527,24 +524,26 @@ void Free1Library(library_t **lib, x64emu_t* emu) ); kh_destroy(bridgemap, (*lib)->bridgemap); } - if((*lib)->symbolmap) - kh_destroy(symbolmap, (*lib)->symbolmap); - if((*lib)->wsymbolmap) - kh_destroy(symbolmap, (*lib)->wsymbolmap); - if((*lib)->datamap) - kh_destroy(datamap, (*lib)->datamap); - if((*lib)->wdatamap) - kh_destroy(datamap, (*lib)->wdatamap); - if((*lib)->mydatamap) - kh_destroy(datamap, (*lib)->mydatamap); - if((*lib)->mysymbolmap) - kh_destroy(symbolmap, (*lib)->mysymbolmap); - if((*lib)->wmysymbolmap) - kh_destroy(symbolmap, (*lib)->wmysymbolmap); - if((*lib)->stsymbolmap) - kh_destroy(symbolmap, (*lib)->stsymbolmap); - if((*lib)->symbol2map) - kh_destroy(symbol2map, (*lib)->symbol2map); + if((*lib)->type == LIB_NATIVE) { + if((*lib)->w.symbolmap) + kh_destroy(symbolmap, (*lib)->w.symbolmap); + if((*lib)->w.wsymbolmap) + kh_destroy(symbolmap, (*lib)->w.wsymbolmap); + if((*lib)->w.datamap) + kh_destroy(datamap, (*lib)->w.datamap); + if((*lib)->w.wdatamap) + kh_destroy(datamap, (*lib)->w.wdatamap); + if((*lib)->w.mydatamap) + kh_destroy(datamap, (*lib)->w.mydatamap); + if((*lib)->w.mysymbolmap) + kh_destroy(symbolmap, (*lib)->w.mysymbolmap); + if((*lib)->w.wmysymbolmap) + kh_destroy(symbolmap, (*lib)->w.wmysymbolmap); + if((*lib)->w.stsymbolmap) + kh_destroy(symbolmap, (*lib)->w.stsymbolmap); + if((*lib)->w.symbol2map) + kh_destroy(symbol2map, (*lib)->w.symbol2map); + } free_neededlib(&(*lib)->needed); free_neededlib(&(*lib)->depended); @@ -562,7 +561,7 @@ int IsSameLib(library_t* lib, const char* path) if(!lib) return 0; char* name = Path2Name(path); - if(!strchr(path, '/') || lib->type==0 || !lib->path) { + if(!strchr(path, '/') || lib->type==LIB_NATIVE || !lib->path) { if(strcmp(name, lib->name)==0) ret=1; } else { @@ -661,52 +660,52 @@ int GetLibLocalSymbolStartEnd(library_t* lib, const char* name, uintptr_t* start } int GetElfIndex(library_t* lib) { - if(!lib || lib->type!=1) + if(!lib || lib->type!=LIB_EMULATED) return -1; - return lib->priv.n.elf_index; + return lib->e.elf_index; } static int getSymbolInDataMaps(library_t*lib, const char* name, int noweak, uintptr_t *addr, uintptr_t *size) { void* symbol; - khint_t k = kh_get(datamap, lib->datamap, name); - if (k!=kh_end(lib->datamap)) { - symbol = dlsym(lib->priv.w.lib, kh_key(lib->datamap, k)); + khint_t k = kh_get(datamap, lib->w.datamap, name); + if (k!=kh_end(lib->w.datamap)) { + symbol = dlsym(lib->w.lib, kh_key(lib->w.datamap, k)); if(symbol) { // found! *addr = (uintptr_t)symbol; - *size = kh_value(lib->datamap, k); + *size = kh_value(lib->w.datamap, k); return 1; } } if(!noweak) { - k = kh_get(datamap, lib->wdatamap, name); - if (k!=kh_end(lib->wdatamap)) { - symbol = dlsym(lib->priv.w.lib, kh_key(lib->wdatamap, k)); + k = kh_get(datamap, lib->w.wdatamap, name); + if (k!=kh_end(lib->w.wdatamap)) { + symbol = dlsym(lib->w.lib, kh_key(lib->w.wdatamap, k)); if(symbol) { // found! *addr = (uintptr_t)symbol; - *size = kh_value(lib->wdatamap, k); + *size = kh_value(lib->w.wdatamap, k); return 1; } } } // check in mydatamap - k = kh_get(datamap, lib->mydatamap, name); - if (k!=kh_end(lib->mydatamap)) { + k = kh_get(datamap, lib->w.mydatamap, name); + if (k!=kh_end(lib->w.mydatamap)) { char buff[200]; if(lib->altmy) strcpy(buff, lib->altmy); else strcpy(buff, "my_"); strcat(buff, name); - symbol = dlsym(lib->priv.w.box64lib, buff); + symbol = dlsym(my_context->box64lib, buff); if(!symbol) printf_log(LOG_NONE, "Warning, data %s not found\n", buff); if(symbol) { // found! *addr = (uintptr_t)symbol; - *size = kh_value(lib->mydatamap, k); + *size = kh_value(lib->w.mydatamap, k); return 1; } } @@ -716,130 +715,130 @@ static int getSymbolInSymbolMaps(library_t*lib, const char* name, int noweak, ui { void* symbol; // check in mysymbolmap - khint_t k = kh_get(symbolmap, lib->mysymbolmap, name); - if (k!=kh_end(lib->mysymbolmap)) { + khint_t k = kh_get(symbolmap, lib->w.mysymbolmap, name); + if (k!=kh_end(lib->w.mysymbolmap)) { char buff[200]; if(lib->altmy) strcpy(buff, lib->altmy); else strcpy(buff, "my_"); strcat(buff, name); - symbol = dlsym(lib->priv.w.box64lib, buff); + symbol = dlsym(my_context->box64lib, buff); if(!symbol) { printf_log(LOG_NONE, "Warning, function %s not found\n", buff); } else - AddOffsetSymbol(lib->context->maplib, symbol, name); - *addr = AddBridge(lib->priv.w.bridge, kh_value(lib->mysymbolmap, k), symbol, 0, name); + AddOffsetSymbol(my_context->maplib, symbol, name); + *addr = AddBridge(lib->w.bridge, kh_value(lib->w.mysymbolmap, k), symbol, 0, name); *size = sizeof(void*); return 1; } // check in stsymbolmap (return struct...) - k = kh_get(symbolmap, lib->stsymbolmap, name); - if (k!=kh_end(lib->stsymbolmap)) { + k = kh_get(symbolmap, lib->w.stsymbolmap, name); + if (k!=kh_end(lib->w.stsymbolmap)) { char buff[200]; if(lib->altmy) strcpy(buff, lib->altmy); else strcpy(buff, "my_"); strcat(buff, name); - symbol = dlsym(lib->priv.w.box64lib, buff); + symbol = dlsym(my_context->box64lib, buff); if(!symbol) { printf_log(LOG_NONE, "Warning, function %s not found\n", buff); } else - AddOffsetSymbol(lib->context->maplib, symbol, name); - *addr = AddBridge(lib->priv.w.bridge, kh_value(lib->stsymbolmap, k), symbol, sizeof(void*), name); + AddOffsetSymbol(my_context->maplib, symbol, name); + *addr = AddBridge(lib->w.bridge, kh_value(lib->w.stsymbolmap, k), symbol, sizeof(void*), name); *size = sizeof(void*); return 1; } // check in symbolmap - k = kh_get(symbolmap, lib->symbolmap, name); - if (k!=kh_end(lib->symbolmap)) { - symbol = dlsym(lib->priv.w.lib, name); - if(!symbol && lib->priv.w.altprefix) { + k = kh_get(symbolmap, lib->w.symbolmap, name); + if (k!=kh_end(lib->w.symbolmap)) { + symbol = dlsym(lib->w.lib, name); + if(!symbol && lib->w.altprefix) { char newname[200]; - strcpy(newname, lib->priv.w.altprefix); + strcpy(newname, lib->w.altprefix); strcat(newname, name); - symbol = dlsym(lib->priv.w.lib, newname); + symbol = dlsym(lib->w.lib, newname); } if(!symbol) - symbol = GetNativeSymbolUnversionned(lib->priv.w.lib, name); - if(!symbol && lib->priv.w.altprefix) { + symbol = GetNativeSymbolUnversionned(lib->w.lib, name); + if(!symbol && lib->w.altprefix) { char newname[200]; - strcpy(newname, lib->priv.w.altprefix); + strcpy(newname, lib->w.altprefix); strcat(newname, name); - symbol = GetNativeSymbolUnversionned(lib->priv.w.lib, newname); + symbol = GetNativeSymbolUnversionned(lib->w.lib, newname); } if(!symbol) { printf_log(LOG_INFO, "Warning, function %s not found in lib %s\n", name, lib->name); return 0; } else - AddOffsetSymbol(lib->context->maplib, symbol, name); - *addr = AddBridge(lib->priv.w.bridge, kh_value(lib->symbolmap, k), symbol, 0, name); + AddOffsetSymbol(my_context->maplib, symbol, name); + *addr = AddBridge(lib->w.bridge, kh_value(lib->w.symbolmap, k), symbol, 0, name); *size = sizeof(void*); return 1; } if(!noweak) { // check in wmysymbolmap - khint_t k = kh_get(symbolmap, lib->wmysymbolmap, name); - if (k!=kh_end(lib->wmysymbolmap)) { + khint_t k = kh_get(symbolmap, lib->w.wmysymbolmap, name); + if (k!=kh_end(lib->w.wmysymbolmap)) { char buff[200]; if(lib->altmy) strcpy(buff, lib->altmy); else strcpy(buff, "my_"); strcat(buff, name); - symbol = dlsym(lib->priv.w.box64lib, buff); + symbol = dlsym(my_context->box64lib, buff); if(!symbol) { printf_log(LOG_NONE, "Warning, function %s not found\n", buff); } else - AddOffsetSymbol(lib->context->maplib, symbol, name); - *addr = AddBridge(lib->priv.w.bridge, kh_value(lib->wmysymbolmap, k), symbol, 0, name); + AddOffsetSymbol(my_context->maplib, symbol, name); + *addr = AddBridge(lib->w.bridge, kh_value(lib->w.wmysymbolmap, k), symbol, 0, name); *size = sizeof(void*); return 1; } - k = kh_get(symbolmap, lib->wsymbolmap, name); - if (k!=kh_end(lib->wsymbolmap)) { - symbol = dlsym(lib->priv.w.lib, name); - if(!symbol && lib->priv.w.altprefix) { + k = kh_get(symbolmap, lib->w.wsymbolmap, name); + if (k!=kh_end(lib->w.wsymbolmap)) { + symbol = dlsym(lib->w.lib, name); + if(!symbol && lib->w.altprefix) { char newname[200]; - strcpy(newname, lib->priv.w.altprefix); + strcpy(newname, lib->w.altprefix); strcat(newname, name); - symbol = dlsym(lib->priv.w.lib, newname); + symbol = dlsym(lib->w.lib, newname); } if(!symbol) - symbol = GetNativeSymbolUnversionned(lib->priv.w.lib, name); - if(!symbol && lib->priv.w.altprefix) { + symbol = GetNativeSymbolUnversionned(lib->w.lib, name); + if(!symbol && lib->w.altprefix) { char newname[200]; - strcpy(newname, lib->priv.w.altprefix); + strcpy(newname, lib->w.altprefix); strcat(newname, name); - symbol = GetNativeSymbolUnversionned(lib->priv.w.lib, newname); + symbol = GetNativeSymbolUnversionned(lib->w.lib, newname); } if(!symbol) { printf_log(LOG_INFO, "Warning, function %s not found in lib %s\n", name, lib->name); return 0; } else - AddOffsetSymbol(lib->context->maplib, symbol, name); - *addr = AddBridge(lib->priv.w.bridge, kh_value(lib->wsymbolmap, k), symbol, 0, name); + AddOffsetSymbol(my_context->maplib, symbol, name); + *addr = AddBridge(lib->w.bridge, kh_value(lib->w.wsymbolmap, k), symbol, 0, name); *size = sizeof(void*); return 1; } } // check in symbol2map - k = kh_get(symbol2map, lib->symbol2map, name); - if (k!=kh_end(lib->symbol2map)) - if(!noweak || !kh_value(lib->symbol2map, k).weak) + k = kh_get(symbol2map, lib->w.symbol2map, name); + if (k!=kh_end(lib->w.symbol2map)) + if(!noweak || !kh_value(lib->w.symbol2map, k).weak) { - symbol = dlsym(lib->priv.w.lib, kh_value(lib->symbol2map, k).name); + symbol = dlsym(lib->w.lib, kh_value(lib->w.symbol2map, k).name); if(!symbol) - symbol = dlsym(RTLD_DEFAULT, kh_value(lib->symbol2map, k).name); // search globaly maybe + symbol = dlsym(RTLD_DEFAULT, kh_value(lib->w.symbol2map, k).name); // search globaly maybe if(!symbol) - symbol = GetNativeSymbolUnversionned(lib->priv.w.lib, kh_value(lib->symbol2map, k).name); + symbol = GetNativeSymbolUnversionned(lib->w.lib, kh_value(lib->w.symbol2map, k).name); if(!symbol) { - printf_log(LOG_INFO, "Warning, function %s not found in lib %s\n", kh_value(lib->symbol2map, k).name, lib->name); + printf_log(LOG_INFO, "Warning, function %s not found in lib %s\n", kh_value(lib->w.symbol2map, k).name, lib->name); return 0; } else - AddOffsetSymbol(lib->context->maplib, symbol, name); - *addr = AddBridge(lib->priv.w.bridge, kh_value(lib->symbol2map, k).w, symbol, 0, name); + AddOffsetSymbol(my_context->maplib, symbol, name); + *addr = AddBridge(lib->w.bridge, kh_value(lib->w.symbol2map, k).w, symbol, 0, name); *size = sizeof(void*); return 1; } @@ -884,9 +883,9 @@ void* GetHandle(library_t* lib) { if(!lib) return NULL; - if(lib->type!=0) + if(lib->type!=LIB_NATIVE) return NULL; - return lib->priv.w.lib; + return lib->w.lib; } lib_t* GetMaplib(library_t* lib) @@ -943,14 +942,14 @@ void AddMainElfToLinkmap(elfheader_t* elf) void setNeededLibs(library_t* lib, int n, ...) { - if(lib->type!=0 && lib->type!=-1) + if(lib->type!=LIB_NATIVE && lib->type!=LIB_UNNKNOW) return; - lib->priv.w.needed = n; - lib->priv.w.neededlibs = (char**)box_calloc(n, sizeof(char*)); + lib->w.needed = n; + lib->w.neededlibs = (char**)box_calloc(n, sizeof(char*)); va_list va; va_start (va, n); for (int i=0; i<n; ++i) { - lib->priv.w.neededlibs[i] = box_strdup(va_arg(va, char*)); + lib->w.neededlibs[i] = box_strdup(va_arg(va, char*)); } va_end (va); } \ No newline at end of file diff --git a/src/librarian/library_private.h b/src/librarian/library_private.h index ebe4d027..f6908cf6 100755 --- a/src/librarian/library_private.h +++ b/src/librarian/library_private.h @@ -35,19 +35,29 @@ typedef struct wlib_s { bridge_t *bridge; void* lib; // dlopen result void* priv; // actual private - void* box64lib; // ref to the dlopen on box64 itself from context char* altprefix; // if function names are mangled.. int needed; char** neededlibs; + kh_symbolmap_t *symbolmap; + kh_symbolmap_t *wsymbolmap; + kh_symbolmap_t *mysymbolmap; + kh_symbolmap_t *wmysymbolmap; + kh_symbolmap_t *stsymbolmap; + kh_symbol2map_t *symbol2map; + kh_datamap_t *datamap; + kh_datamap_t *wdatamap; + kh_datamap_t *mydatamap; + char *altmy; // to avoid duplicate symbol, like with SDL1/SDL2 } wlib_t; -typedef struct nlib_s { +typedef struct elib_s { int elf_index; + elfheader_t *elf; int finalized; kh_mapsymbols_t *mapsymbols; kh_mapsymbols_t *weaksymbols; kh_mapsymbols_t *localsymbols; -} nlib_t; +} elib_t; typedef struct library_s { char* name; // <> path @@ -61,23 +71,13 @@ typedef struct library_s { wrappedlib_get_t getlocal; union { wlib_t w; - nlib_t n; - } priv; // private lib data - box64context_t *context; // parent context - kh_bridgemap_t *bridgemap; - kh_symbolmap_t *symbolmap; - kh_symbolmap_t *wsymbolmap; - kh_symbolmap_t *mysymbolmap; - kh_symbolmap_t *wmysymbolmap; - kh_symbolmap_t *stsymbolmap; - kh_symbol2map_t *symbol2map; - kh_datamap_t *datamap; - kh_datamap_t *wdatamap; - kh_datamap_t *mydatamap; + elib_t e; + }; // private lib data char *altmy; // to avoid duplicate symbol, like with SDL1/SDL2 needed_libs_t needed; needed_libs_t depended; // used to free library lib_t *maplib; // local maplib, for dlopen'd library with LOCAL binding (most of the dlopen) + kh_bridgemap_t *bridgemap; } library_t; // type for map elements diff --git a/src/libtools/obstack.c b/src/libtools/obstack.c index c090005a..3ebd770a 100755 --- a/src/libtools/obstack.c +++ b/src/libtools/obstack.c @@ -65,12 +65,12 @@ static void* findchunkfunFct(void* fct) static void* reverse_chunkfunFct(library_t* lib, void* fct) { if(!fct) return fct; - if(CheckBridged(lib->priv.w.bridge, fct)) - return (void*)CheckBridged(lib->priv.w.bridge, fct); + if(CheckBridged(lib->w.bridge, fct)) + return (void*)CheckBridged(lib->w.bridge, fct); #define GO(A) if(my_chunkfun_##A == fct) return (void*)my_chunkfun_fct_##A; SUPER() #undef GO - return (void*)AddBridge(lib->priv.w.bridge, pFL, fct, 0, NULL); + return (void*)AddBridge(lib->w.bridge, pFL, fct, 0, NULL); } // freefun #define GO(A) \ @@ -98,12 +98,12 @@ static void* findfreefunFct(void* fct) static void* reverse_freefunFct(library_t* lib, void* fct) { if(!fct) return fct; - if(CheckBridged(lib->priv.w.bridge, fct)) - return (void*)CheckBridged(lib->priv.w.bridge, fct); + if(CheckBridged(lib->w.bridge, fct)) + return (void*)CheckBridged(lib->w.bridge, fct); #define GO(A) if(my_freefun_##A == fct) return (void*)my_freefun_fct_##A; SUPER() #undef GO - return (void*)AddBridge(lib->priv.w.bridge, vFp, fct, 0, NULL); + return (void*)AddBridge(lib->w.bridge, vFp, fct, 0, NULL); } #undef SUPER diff --git a/src/wrapped/wrappedbz2.c b/src/wrapped/wrappedbz2.c index a5b0e5ae..e3ff920e 100755 --- a/src/wrapped/wrappedbz2.c +++ b/src/wrapped/wrappedbz2.c @@ -57,12 +57,12 @@ static void* find_alloc_Fct(void* fct) static void* reverse_alloc_Fct(void* fct) { if(!fct) return fct; - if(CheckBridged(my_lib->priv.w.bridge, fct)) - return (void*)CheckBridged(my_lib->priv.w.bridge, fct); + if(CheckBridged(my_lib->w.bridge, fct)) + return (void*)CheckBridged(my_lib->w.bridge, fct); #define GO(A) if(my_alloc_##A == fct) return (void*)my_alloc_fct_##A; SUPER() #undef GO - return (void*)AddBridge(my_lib->priv.w.bridge, pFpii, fct, 0, NULL); + return (void*)AddBridge(my_lib->w.bridge, pFpii, fct, 0, NULL); } // free ... #define GO(A) \ @@ -89,12 +89,12 @@ static void* find_free_Fct(void* fct) static void* reverse_free_Fct(void* fct) { if(!fct) return fct; - if(CheckBridged(my_lib->priv.w.bridge, fct)) - return (void*)CheckBridged(my_lib->priv.w.bridge, fct); + if(CheckBridged(my_lib->w.bridge, fct)) + return (void*)CheckBridged(my_lib->w.bridge, fct); #define GO(A) if(my_free_##A == fct) return (void*)my_free_fct_##A; SUPER() #undef GO - return (void*)AddBridge(my_lib->priv.w.bridge, vFpp, fct, 0, NULL); + return (void*)AddBridge(my_lib->w.bridge, vFpp, fct, 0, NULL); } #undef SUPER diff --git a/src/wrapped/wrappedcrashhandler.c b/src/wrapped/wrappedcrashhandler.c index 115e3150..c6f625df 100755 --- a/src/wrapped/wrappedcrashhandler.c +++ b/src/wrapped/wrappedcrashhandler.c @@ -24,7 +24,7 @@ const char* crashhandlerName = "crashhandler.so"; if(!box64_steam) \ return -1; \ if(1) \ - lib->priv.w.lib = dlopen(NULL, RTLD_LAZY | RTLD_GLOBAL);\ + lib->w.lib = dlopen(NULL, RTLD_LAZY | RTLD_GLOBAL);\ else diff --git a/src/wrapped/wrappedglib2.c b/src/wrapped/wrappedglib2.c index 48742b67..0c5663bc 100755 --- a/src/wrapped/wrappedglib2.c +++ b/src/wrapped/wrappedglib2.c @@ -816,7 +816,7 @@ EXPORT void* my_g_main_context_get_poll_func(x64emu_t* emu, void* context) void* r = reversePollFct(ret); if(r) return r; // needs to bridge.... - return (void*)AddCheckBridge(my_lib->priv.w.bridge, iFpui, ret, 0, NULL); + return (void*)AddCheckBridge(my_lib->w.bridge, iFpui, ret, 0, NULL); } EXPORT void my_g_main_context_set_poll_func(x64emu_t* emu, void* context, void* func) diff --git a/src/wrapped/wrappedgobject2.c b/src/wrapped/wrappedgobject2.c index c4f95265..b70c6db0 100755 --- a/src/wrapped/wrappedgobject2.c +++ b/src/wrapped/wrappedgobject2.c @@ -127,7 +127,7 @@ static void signal_delete(my_signal_t* sig, void* b) static void addGObject2Alternate(library_t* lib) { - #define GO(A, W) AddAutomaticBridge(thread_get_emu(), lib->priv.w.bridge, W, dlsym(lib->priv.w.lib, #A), 0) + #define GO(A, W) AddAutomaticBridge(thread_get_emu(), lib->w.bridge, W, dlsym(lib->w.lib, #A), 0) GO(g_cclosure_marshal_VOID__VOID, vFppuppp); GO(g_cclosure_marshal_VOID__BOOLEAN, vFppuppp); GO(g_cclosure_marshal_VOID__UCHAR, vFppuppp); @@ -173,7 +173,7 @@ static void addGObject2Alternate(library_t* lib) GO(g_cclosure_marshal_BOOLEAN__FLAGSv, vFpppppip); GO(g_cclosure_marshal_BOOLEAN__BOXED_BOXEDv, vFpppppip); #undef GO - #define GO(A, W) AddAutomaticBridge(thread_get_emu(), lib->priv.w.bridge, W, A, 0) + #define GO(A, W) AddAutomaticBridge(thread_get_emu(), lib->w.bridge, W, A, 0) GO(signal_cb, iFpppp); GO(signal_cb_swapped, iFpppp); GO(signal_cb_5, iFppppp); @@ -220,7 +220,7 @@ EXPORT uintptr_t my_g_signal_connect_data(x64emu_t* emu, void* instance, void* d EXPORT void* my_g_object_connect(x64emu_t* emu, void* object, void* signal_spec, void** b) { - //gobject2_my_t *my = (gobject2_my_t*)my_lib->priv.w.p2; + //gobject2_my_t *my = (gobject2_my_t*)my_lib->w.p2; char* spec = (char*)signal_spec; while(spec) { @@ -345,7 +345,7 @@ static void* findMarshalFct(void* fct) #define GO(A) if(my_marshal_fct_##A == (uintptr_t)fct) return my_marshal_##A; SUPER() #undef GO - #define GO(A) if(my_marshal_fct_##A == 0) {AddAutomaticBridge(thread_get_emu(), my_lib->priv.w.bridge, vFppuppp, my_marshal_##A, 0); my_marshal_fct_##A = (uintptr_t)fct; return my_marshal_##A; } + #define GO(A) if(my_marshal_fct_##A == 0) {AddAutomaticBridge(thread_get_emu(), my_lib->w.bridge, vFppuppp, my_marshal_##A, 0); my_marshal_fct_##A = (uintptr_t)fct; return my_marshal_##A; } SUPER() #undef GO printf_log(LOG_NONE, "Warning, no more slot for gobject Closure Marshal callback\n"); @@ -723,7 +723,7 @@ EXPORT unsigned long my_g_signal_add_emission_hook(x64emu_t* emu, uint32_t signa EXPORT size_t my_g_type_register_static_simple(x64emu_t* emu, size_t parent, void* name, size_t class_size, void* class_init, size_t instance_size, void* instance_init, int flags) { - //gobject2_my_t *my = (gobject2_my_t*)my_lib->priv.w.p2; + //gobject2_my_t *my = (gobject2_my_t*)my_lib->w.p2; my_GTypeInfo_t info = {0}; info.class_size = class_size; @@ -861,7 +861,7 @@ EXPORT void my_g_signal_override_class_handler(x64emu_t* emu, char* name, void* return -1; #define CUSTOM_INIT \ - InitGTKClass(lib->priv.w.bridge); \ + InitGTKClass(lib->w.bridge); \ getMy(lib); \ SetGObjectID(my->g_object_get_type()); \ SetGTypeName(my->g_type_name); \ diff --git a/src/wrapped/wrappedgtkx112.c b/src/wrapped/wrappedgtkx112.c index c7d42e83..4955385c 100755 --- a/src/wrapped/wrappedgtkx112.c +++ b/src/wrapped/wrappedgtkx112.c @@ -634,12 +634,12 @@ static void* find_GtkLinkButtonUri_Fct(void* fct) static void* reverse_GtkLinkButtonUri_Fct(void* fct) { if(!fct) return fct; - if(CheckBridged(my_lib->priv.w.bridge, fct)) - return (void*)CheckBridged(my_lib->priv.w.bridge, fct); + if(CheckBridged(my_lib->w.bridge, fct)) + return (void*)CheckBridged(my_lib->w.bridge, fct); #define GO(A) if(my_GtkLinkButtonUri_##A == fct) return (void*)my_GtkLinkButtonUri_fct_##A; SUPER() #undef GO - return (void*)AddBridge(my_lib->priv.w.bridge, vFppp, fct, 0, NULL); + return (void*)AddBridge(my_lib->w.bridge, vFppp, fct, 0, NULL); } #undef SUPER diff --git a/src/wrapped/wrappedldlinux.c b/src/wrapped/wrappedldlinux.c index e8c56bc0..1030fc5f 100755 --- a/src/wrapped/wrappedldlinux.c +++ b/src/wrapped/wrappedldlinux.c @@ -33,7 +33,7 @@ const char* ldlinuxName = "ld-linux.so.2"; #define PRE_INIT\ if(1) \ - lib->priv.w.lib = dlopen(NULL, RTLD_LAZY | RTLD_GLOBAL); \ + lib->w.lib = dlopen(NULL, RTLD_LAZY | RTLD_GLOBAL); \ else // define all standard library functions diff --git a/src/wrapped/wrappedlib_init.h b/src/wrapped/wrappedlib_init.h index e19d4352..b61989b0 100755 --- a/src/wrapped/wrappedlib_init.h +++ b/src/wrapped/wrappedlib_init.h @@ -122,16 +122,16 @@ int FUNC(_init)(library_t* lib, box64context_t* box64) PRE_INIT #endif { - lib->priv.w.lib = dlopen(MAPNAME(Name), RTLD_LAZY | RTLD_GLOBAL); - if(!lib->priv.w.lib) { + lib->w.lib = dlopen(MAPNAME(Name), RTLD_LAZY | RTLD_GLOBAL); + if(!lib->w.lib) { #ifdef ALTNAME - lib->priv.w.lib = dlopen(ALTNAME, RTLD_LAZY | RTLD_GLOBAL); - if(!lib->priv.w.lib) + lib->w.lib = dlopen(ALTNAME, RTLD_LAZY | RTLD_GLOBAL); + if(!lib->w.lib) #endif #ifdef ALTNAME2 { - lib->priv.w.lib = dlopen(ALTNAME2, RTLD_LAZY | RTLD_GLOBAL); - if(!lib->priv.w.lib) + lib->w.lib = dlopen(ALTNAME2, RTLD_LAZY | RTLD_GLOBAL); + if(!lib->w.lib) #endif return -1; #ifdef ALTNAME2 @@ -151,11 +151,11 @@ int FUNC(_init)(library_t* lib, box64context_t* box64) cnt = sizeof(MAPNAME(mapname))/sizeof(map_onesymbol_t); \ for (int i = 0; i < cnt; ++i) { \ if (MAPNAME(mapname)[i].weak) { \ - k = kh_put(symbolmap, lib->w##mapname, MAPNAME(mapname)[i].name, &ret); \ - kh_value(lib->w##mapname, k) = MAPNAME(mapname)[i].w; \ + k = kh_put(symbolmap, lib->w.w##mapname, MAPNAME(mapname)[i].name, &ret); \ + kh_value(lib->w.w##mapname, k) = MAPNAME(mapname)[i].w; \ } else { \ - k = kh_put(symbolmap, lib->mapname, MAPNAME(mapname)[i].name, &ret); \ - kh_value(lib->mapname, k) = MAPNAME(mapname)[i].w; \ + k = kh_put(symbolmap, lib->w.mapname, MAPNAME(mapname)[i].name, &ret); \ + kh_value(lib->w.mapname, k) = MAPNAME(mapname)[i].w; \ } \ if (strchr(MAPNAME(mapname)[i].name, '@')) \ AddDictionnary(box64->versym, MAPNAME(mapname)[i].name); \ @@ -165,34 +165,34 @@ int FUNC(_init)(library_t* lib, box64context_t* box64) #undef DOIT cnt = sizeof(MAPNAME(stsymbolmap))/sizeof(map_onesymbol_t); for (int i=0; i<cnt; ++i) { - k = kh_put(symbolmap, lib->stsymbolmap, MAPNAME(stsymbolmap)[i].name, &ret); - kh_value(lib->stsymbolmap, k) = MAPNAME(stsymbolmap)[i].w; + k = kh_put(symbolmap, lib->w.stsymbolmap, MAPNAME(stsymbolmap)[i].name, &ret); + kh_value(lib->w.stsymbolmap, k) = MAPNAME(stsymbolmap)[i].w; if(strchr(MAPNAME(stsymbolmap)[i].name, '@')) AddDictionnary(box64->versym, MAPNAME(stsymbolmap)[i].name); } cnt = sizeof(MAPNAME(symbol2map))/sizeof(map_onesymbol2_t); for (int i=0; i<cnt; ++i) { - k = kh_put(symbol2map, lib->symbol2map, MAPNAME(symbol2map)[i].name, &ret); - kh_value(lib->symbol2map, k).name = MAPNAME(symbol2map)[i].name2; - kh_value(lib->symbol2map, k).w = MAPNAME(symbol2map)[i].w; - kh_value(lib->symbol2map, k).weak = MAPNAME(symbol2map)[i].weak; + k = kh_put(symbol2map, lib->w.symbol2map, MAPNAME(symbol2map)[i].name, &ret); + kh_value(lib->w.symbol2map, k).name = MAPNAME(symbol2map)[i].name2; + kh_value(lib->w.symbol2map, k).w = MAPNAME(symbol2map)[i].w; + kh_value(lib->w.symbol2map, k).weak = MAPNAME(symbol2map)[i].weak; if(strchr(MAPNAME(symbol2map)[i].name, '@')) AddDictionnary(box64->versym, MAPNAME(symbol2map)[i].name); } cnt = sizeof(MAPNAME(datamap))/sizeof(map_onedata_t); for (int i=0; i<cnt; ++i) { if(MAPNAME(datamap)[i].weak) { - k = kh_put(datamap, lib->wdatamap, MAPNAME(datamap)[i].name, &ret); - kh_value(lib->wdatamap, k) = MAPNAME(datamap)[i].sz; + k = kh_put(datamap, lib->w.wdatamap, MAPNAME(datamap)[i].name, &ret); + kh_value(lib->w.wdatamap, k) = MAPNAME(datamap)[i].sz; } else { - k = kh_put(datamap, lib->datamap, MAPNAME(datamap)[i].name, &ret); - kh_value(lib->datamap, k) = MAPNAME(datamap)[i].sz; + k = kh_put(datamap, lib->w.datamap, MAPNAME(datamap)[i].name, &ret); + kh_value(lib->w.datamap, k) = MAPNAME(datamap)[i].sz; } } cnt = sizeof(MAPNAME(mydatamap))/sizeof(map_onedata_t); for (int i=0; i<cnt; ++i) { - k = kh_put(datamap, lib->mydatamap, MAPNAME(mydatamap)[i].name, &ret); - kh_value(lib->mydatamap, k) = MAPNAME(mydatamap)[i].sz; + k = kh_put(datamap, lib->w.mydatamap, MAPNAME(mydatamap)[i].name, &ret); + kh_value(lib->w.mydatamap, k) = MAPNAME(mydatamap)[i].sz; } #ifdef CUSTOM_INIT CUSTOM_INIT diff --git a/src/wrapped/wrappedlibasound.c b/src/wrapped/wrappedlibasound.c index 54d55804..6d7420c6 100755 --- a/src/wrapped/wrappedlibasound.c +++ b/src/wrapped/wrappedlibasound.c @@ -138,11 +138,9 @@ EXPORT void* my_snd_dlsym(x64emu_t* emu, void* handle, void* name, void* version } #define CUSTOM_INIT \ - box64->asound = lib; \ getMy(lib); #define CUSTOM_FINI \ - lib->context->asound = NULL; \ freeMy(); #include "wrappedlib_init.h" diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c index 37a6b175..630b5cd1 100755 --- a/src/wrapped/wrappedlibc.c +++ b/src/wrapped/wrappedlibc.c @@ -987,7 +987,7 @@ EXPORT void my__ITM_addUserCommitAction(x64emu_t* emu, void* cb, uint32_t b, voi // disabled for now... Are all this _ITM_ stuff really mendatory? #if 0 // quick and dirty... Should store the callback to be removed later.... - libc_my_t *my = (libc_my_t *)emu->context->libclib->priv.w.p2; + libc_my_t *my = (libc_my_t *)emu->context->libclib->w.p2; x64emu_t *cbemu = AddCallback(emu, (uintptr_t)cb, 1, c, NULL, NULL, NULL); my->_ITM_addUserCommitAction(libc1ArgCallback, b, cbemu); // should keep track of cbemu to remove at some point... @@ -1227,7 +1227,7 @@ EXPORT void* my_readdir(x64emu_t* emu, void* dirp) if(!f) { library_t* lib = my_lib; if(!lib) return NULL; - f = (pFp_t)dlsym(lib->priv.w.lib, "readdir"); + f = (pFp_t)dlsym(lib->w.lib, "readdir"); } return f(dirp); @@ -1247,7 +1247,7 @@ EXPORT int32_t my_readdir_r(x64emu_t* emu, void* dirp, void* entry, void** resul *result = NULL; return 0; } - f = (iFppp_t)dlsym(lib->priv.w.lib, "readdir64_r"); + f = (iFppp_t)dlsym(lib->w.lib, "readdir64_r"); } int r = f(dirp, &d64, &dp64); @@ -1283,7 +1283,7 @@ EXPORT int32_t my_readdir_r(x64emu_t* emu, void* dirp, void* entry, void** resul *result = NULL; return 0; } - f = (iFppp_t)dlsym(lib->priv.w.lib, "readdir_r"); + f = (iFppp_t)dlsym(lib->w.lib, "readdir_r"); } return f(dirp, entry, result); @@ -1592,7 +1592,7 @@ EXPORT int32_t my_ftw(x64emu_t* emu, void* pathname, void* B, int32_t nopenfd) if(!f) { library_t* lib = my_lib; if(!lib) return 0; - f = (iFppi_t)dlsym(lib->priv.w.lib, "ftw"); + f = (iFppi_t)dlsym(lib->w.lib, "ftw"); } return f(pathname, findftwFct(B), nopenfd); @@ -1604,7 +1604,7 @@ EXPORT int32_t my_nftw(x64emu_t* emu, void* pathname, void* B, int32_t nopenfd, if(!f) { library_t* lib = my_lib; if(!lib) return 0; - f = (iFppii_t)dlsym(lib->priv.w.lib, "nftw"); + f = (iFppii_t)dlsym(lib->w.lib, "nftw"); } return f(pathname, findnftwFct(B), nopenfd, flags); @@ -2073,7 +2073,7 @@ EXPORT int32_t my_preadv64(x64emu_t* emu, int32_t fd, void* v, int32_t c, int64_ { library_t* lib = my_lib; if(!lib) return 0; - void* f = dlsym(lib->priv.w.lib, "preadv64"); + void* f = dlsym(lib->w.lib, "preadv64"); if(f) return ((iFipiI_t)f)(fd, v, c, o); return syscall(__NR_preadv, fd, v, c,(uint32_t)(o&0xffffffff), (uint32_t)((o>>32)&0xffffffff)); @@ -2083,7 +2083,7 @@ EXPORT int32_t my_pwritev64(x64emu_t* emu, int32_t fd, void* v, int32_t c, int64 { library_t* lib = my_lib; if(!lib) return 0; - void* f = dlsym(lib->priv.w.lib, "pwritev64"); + void* f = dlsym(lib->w.lib, "pwritev64"); if(f) return ((iFipiI_t)f)(fd, v, c, o); #ifdef __arm__ @@ -2098,7 +2098,7 @@ EXPORT int32_t my_accept4(x64emu_t* emu, int32_t fd, void* a, void* l, int32_t f { library_t* lib = my_lib; if(!lib) return 0; - void* f = dlsym(lib->priv.w.lib, "accept4"); + void* f = dlsym(lib->w.lib, "accept4"); if(f) return ((iFippi_t)f)(fd, a, l, flags); if(!flags) @@ -2112,7 +2112,7 @@ EXPORT int32_t my_fallocate64(int fd, int mode, int64_t offs, int64_t len) static int done = 0; if(!done) { library_t* lib = my_lib; - f = (iFiiII_t)dlsym(lib->priv.w.lib, "fallocate64"); + f = (iFiiII_t)dlsym(lib->w.lib, "fallocate64"); done = 1; } if(f) @@ -2521,7 +2521,7 @@ EXPORT int my___libc_alloca_cutoff(x64emu_t* emu, size_t size) // not always implemented on old linux version... library_t* lib = my_lib; if(!lib) return 0; - void* f = dlsym(lib->priv.w.lib, "__libc_alloca_cutoff"); + void* f = dlsym(lib->w.lib, "__libc_alloca_cutoff"); if(f) return ((iFL_t)f)(size); // approximate version but it's better than nothing.... @@ -2620,7 +2620,7 @@ EXPORT int my_getentropy(x64emu_t* emu, void* buffer, size_t length) { library_t* lib = my_lib; if(!lib) return 0; - void* f = dlsym(lib->priv.w.lib, "getentropy"); + void* f = dlsym(lib->w.lib, "getentropy"); if(f) return ((iFpL_t)f)(buffer, length); // custom implementation @@ -2911,7 +2911,7 @@ EXPORT char my___libc_single_threaded = 0; #define PRE_INIT\ if(box64_tcmalloc_minimal) \ - lib->priv.w.lib = dlopen(NULL, RTLD_LAZY | RTLD_GLOBAL); \ + lib->w.lib = dlopen(NULL, RTLD_LAZY | RTLD_GLOBAL); \ else #define CUSTOM_INIT \ diff --git a/src/wrapped/wrappedlibgl.c b/src/wrapped/wrappedlibgl.c index 006774aa..96128410 100755 --- a/src/wrapped/wrappedlibgl.c +++ b/src/wrapped/wrappedlibgl.c @@ -197,11 +197,11 @@ EXPORT void* my_glGetVkProcAddrNV(x64emu_t* emu, void* name) return my_GetVkProcAddr(emu, name, GetVkProcAddrNV); } -#define PRE_INIT if(libGL) {lib->priv.w.lib = dlopen(libGL, RTLD_LAZY | RTLD_GLOBAL); lib->path = strdup(libGL);} else +#define PRE_INIT if(libGL) {lib->w.lib = dlopen(libGL, RTLD_LAZY | RTLD_GLOBAL); lib->path = strdup(libGL);} else #define CUSTOM_INIT \ - lib->priv.w.priv = dlsym(lib->priv.w.lib, "glXGetProcAddress"); \ + lib->w.priv = dlsym(lib->w.lib, "glXGetProcAddress"); \ if (!box64->glxprocaddress) \ - box64->glxprocaddress = lib->priv.w.priv; + box64->glxprocaddress = lib->w.priv; #include "wrappedlib_init.h" diff --git a/src/wrapped/wrappedlibglu.c b/src/wrapped/wrappedlibglu.c index 082e724c..57a2bb4e 100755 --- a/src/wrapped/wrappedlibglu.c +++ b/src/wrapped/wrappedlibglu.c @@ -132,7 +132,6 @@ void EXPORT my_gluNurbsCallback(x64emu_t* emu, void* a, int32_t b, void* cb) } #define CUSTOM_INIT \ - box64->libglu = lib; \ getMy(lib); \ setNeededLibs(lib, 1, "libGL.so.1"); diff --git a/src/wrapped/wrappedlibm.c b/src/wrapped/wrappedlibm.c index 48c34580..43bdf5cc 100755 --- a/src/wrapped/wrappedlibm.c +++ b/src/wrapped/wrappedlibm.c @@ -32,7 +32,7 @@ EXPORT R my___##N##_finite P \ static int check = 0; \ T f = NULL; \ if(!check) { \ - f = (T)dlsym(my_lib->priv.w.lib, "__" #N "_finite"); \ + f = (T)dlsym(my_lib->w.lib, "__" #N "_finite"); \ ++check; \ } \ if(f) \ diff --git a/src/wrapped/wrappedlibpcre.c b/src/wrapped/wrappedlibpcre.c index fbd2218b..1175f7dd 100755 --- a/src/wrapped/wrappedlibpcre.c +++ b/src/wrapped/wrappedlibpcre.c @@ -25,7 +25,7 @@ void wrapped_pcre_free(void* p) { EXPORT pcre_free_t pcre_free = wrapped_pcre_free; #define CUSTOM_INIT \ - my_pcre_free = AddCheckBridge(lib->priv.w.bridge, vFp, free, 0, "free"); + my_pcre_free = AddCheckBridge(lib->w.bridge, vFp, free, 0, "free"); #include "wrappedlib_init.h" diff --git a/src/wrapped/wrappedlibssl.c b/src/wrapped/wrappedlibssl.c index 0d7fc823..40ca1a7f 100755 --- a/src/wrapped/wrappedlibssl.c +++ b/src/wrapped/wrappedlibssl.c @@ -109,12 +109,12 @@ static void* find_verify_Fct(void* fct) static void* reverse_verify_Fct(void* fct) { if(!fct) return fct; - if(CheckBridged(my_lib->priv.w.bridge, fct)) - return (void*)CheckBridged(my_lib->priv.w.bridge, fct); + if(CheckBridged(my_lib->w.bridge, fct)) + return (void*)CheckBridged(my_lib->w.bridge, fct); #define GO(A) if(my_verify_##A == fct) return (void*)my_verify_fct_##A; SUPER() #undef GO - return (void*)AddBridge(my_lib->priv.w.bridge, iFip, fct, 0, NULL); + return (void*)AddBridge(my_lib->w.bridge, iFip, fct, 0, NULL); } // ex_new diff --git a/src/wrapped/wrappedlibusb1.c b/src/wrapped/wrappedlibusb1.c index 31d0867b..e34f440f 100755 --- a/src/wrapped/wrappedlibusb1.c +++ b/src/wrapped/wrappedlibusb1.c @@ -90,12 +90,12 @@ static void* findtransfertFct(void* fct) static void* reverse_transfert_Fct(void* fct) { if(!fct) return fct; - if(CheckBridged(my_lib->priv.w.bridge, fct)) - return (void*)CheckBridged(my_lib->priv.w.bridge, fct); + if(CheckBridged(my_lib->w.bridge, fct)) + return (void*)CheckBridged(my_lib->w.bridge, fct); #define GO(A) if(my_transfert_##A == fct) return (void*)my_transfert_fct_##A; SUPER() #undef GO - return (void*)AddBridge(my_lib->priv.w.bridge, vFp, fct, 0, NULL); + return (void*)AddBridge(my_lib->w.bridge, vFp, fct, 0, NULL); } #undef SUPER diff --git a/src/wrapped/wrappedlibvorbis.c b/src/wrapped/wrappedlibvorbis.c index d9018689..74495820 100755 --- a/src/wrapped/wrappedlibvorbis.c +++ b/src/wrapped/wrappedlibvorbis.c @@ -21,10 +21,4 @@ const char* libvorbisName = "libvorbis.so.0"; #define LIBNAME libvorbis -#define CUSTOM_INIT \ - box64->vorbis = lib; - -#define CUSTOM_FINI \ - lib->context->vorbis = NULL; - #include "wrappedlib_init.h" diff --git a/src/wrapped/wrappedlibx11.c b/src/wrapped/wrappedlibx11.c index 9d8fd445..fa12a53c 100755 --- a/src/wrapped/wrappedlibx11.c +++ b/src/wrapped/wrappedlibx11.c @@ -139,12 +139,12 @@ static void* findwire_to_eventFct(void* fct) static void* reverse_wire_to_eventFct(library_t* lib, void* fct) { if(!fct) return fct; - if(CheckBridged(lib->priv.w.bridge, fct)) - return (void*)CheckBridged(lib->priv.w.bridge, fct); + if(CheckBridged(lib->w.bridge, fct)) + return (void*)CheckBridged(lib->w.bridge, fct); #define GO(A) if(my_wire_to_event_##A == fct) return (void*)my_wire_to_event_fct_##A; SUPER() #undef GO - return (void*)AddBridge(lib->priv.w.bridge, iFppp, fct, 0, NULL); + return (void*)AddBridge(lib->w.bridge, iFppp, fct, 0, NULL); } // event_to_wire @@ -172,12 +172,12 @@ static void* findevent_to_wireFct(void* fct) static void* reverse_event_to_wireFct(library_t* lib, void* fct) { if(!fct) return fct; - if(CheckBridged(lib->priv.w.bridge, fct)) - return (void*)CheckBridged(lib->priv.w.bridge, fct); + if(CheckBridged(lib->w.bridge, fct)) + return (void*)CheckBridged(lib->w.bridge, fct); #define GO(A) if(my_event_to_wire_##A == fct) return (void*)my_event_to_wire_fct_##A; SUPER() #undef GO - return (void*)AddBridge(lib->priv.w.bridge, iFppp, fct, 0, NULL); + return (void*)AddBridge(lib->w.bridge, iFppp, fct, 0, NULL); } // error_handler @@ -205,12 +205,12 @@ static void* finderror_handlerFct(void* fct) static void* reverse_error_handlerFct(library_t* lib, void* fct) { if(!fct) return fct; - if(CheckBridged(lib->priv.w.bridge, fct)) - return (void*)CheckBridged(lib->priv.w.bridge, fct); + if(CheckBridged(lib->w.bridge, fct)) + return (void*)CheckBridged(lib->w.bridge, fct); #define GO(A) if(my_error_handler_##A == fct) return (void*)my_error_handler_fct_##A; SUPER() #undef GO - return (void*)AddBridge(lib->priv.w.bridge, iFpp, fct, 0, NULL); + return (void*)AddBridge(lib->w.bridge, iFpp, fct, 0, NULL); } // ioerror_handler @@ -238,12 +238,12 @@ static void* findioerror_handlerFct(void* fct) static void* reverse_ioerror_handlerFct(library_t* lib, void* fct) { if(!fct) return fct; - if(CheckBridged(lib->priv.w.bridge, fct)) - return (void*)CheckBridged(lib->priv.w.bridge, fct); + if(CheckBridged(lib->w.bridge, fct)) + return (void*)CheckBridged(lib->w.bridge, fct); #define GO(A) if(my_ioerror_handler_##A == fct) return (void*)my_ioerror_handler_fct_##A; SUPER() #undef GO - return (void*)AddBridge(lib->priv.w.bridge, iFp, fct, 0, NULL); + return (void*)AddBridge(lib->w.bridge, iFp, fct, 0, NULL); } // exterror_handler @@ -271,12 +271,12 @@ static void* findexterror_handlerFct(void* fct) static void* reverse_exterror_handlerFct(library_t* lib, void* fct) { if(!fct) return fct; - if(CheckBridged(lib->priv.w.bridge, fct)) - return (void*)CheckBridged(lib->priv.w.bridge, fct); + if(CheckBridged(lib->w.bridge, fct)) + return (void*)CheckBridged(lib->w.bridge, fct); #define GO(A) if(my_exterror_handler_##A == fct) return (void*)my_exterror_handler_fct_##A; SUPER() #undef GO - return (void*)AddBridge(lib->priv.w.bridge, iFpppp, fct, 0, NULL); + return (void*)AddBridge(lib->w.bridge, iFpppp, fct, 0, NULL); } // close_display @@ -304,12 +304,12 @@ static void* findclose_displayFct(void* fct) static void* reverse_close_displayFct(library_t* lib, void* fct) { if(!fct) return fct; - if(CheckBridged(lib->priv.w.bridge, fct)) - return (void*)CheckBridged(lib->priv.w.bridge, fct); + if(CheckBridged(lib->w.bridge, fct)) + return (void*)CheckBridged(lib->w.bridge, fct); #define GO(A) if(my_close_display_##A == fct) return (void*)my_close_display_fct_##A; SUPER() #undef GO - return (void*)AddBridge(lib->priv.w.bridge, iFpp, fct, 0, NULL); + return (void*)AddBridge(lib->w.bridge, iFpp, fct, 0, NULL); } // register_im @@ -337,12 +337,12 @@ static void* findregister_imFct(void* fct) static void* reverse_register_imFct(library_t* lib, void* fct) { if(!fct) return fct; - if(CheckBridged(lib->priv.w.bridge, fct)) - return (void*)CheckBridged(lib->priv.w.bridge, fct); + if(CheckBridged(lib->w.bridge, fct)) + return (void*)CheckBridged(lib->w.bridge, fct); #define GO(A) if(my_register_im_##A == fct) return (void*)my_register_im_fct_##A; SUPER() #undef GO - return (void*)AddBridge(lib->priv.w.bridge, iFppp, fct, 0, NULL); + return (void*)AddBridge(lib->w.bridge, iFppp, fct, 0, NULL); } // XConnectionWatchProc @@ -437,12 +437,12 @@ static void* findXSynchronizeProcFct(void* fct) static void* reverse_XSynchronizeProcFct(library_t* lib, void* fct) { if(!fct) return fct; - if(CheckBridged(lib->priv.w.bridge, fct)) - return (void*)CheckBridged(lib->priv.w.bridge, fct); + if(CheckBridged(lib->w.bridge, fct)) + return (void*)CheckBridged(lib->w.bridge, fct); #define GO(A) if(my_XSynchronizeProc_##A == fct) return (void*)my_XSynchronizeProc_fct_##A; SUPER() #undef GO - return (void*)AddBridge(lib->priv.w.bridge, iFppp, fct, 0, NULL); + return (void*)AddBridge(lib->w.bridge, iFppp, fct, 0, NULL); } // XLockDisplay @@ -1153,12 +1153,10 @@ EXPORT void* my_XOpenDisplay(x64emu_t* emu, void* d) } #define CUSTOM_INIT \ - box64->x11lib = lib; \ getMy(lib); \ if(x11threads) my->XInitThreads(); #define CUSTOM_FINI \ - freeMy(); \ - ((box64context_t*)(lib->context))->x11lib = NULL; \ + freeMy(); #include "wrappedlib_init.h" diff --git a/src/wrapped/wrappedlibxext.c b/src/wrapped/wrappedlibxext.c index 7d8aebc2..efc2fba4 100755 --- a/src/wrapped/wrappedlibxext.c +++ b/src/wrapped/wrappedlibxext.c @@ -76,12 +76,12 @@ static void* find_exterrorhandle_Fct(void* fct) static void* reverse_exterrorhandleFct(void* fct) { if(!fct) return fct; - if(CheckBridged(my_lib->priv.w.bridge, fct)) - return (void*)CheckBridged(my_lib->priv.w.bridge, fct); + if(CheckBridged(my_lib->w.bridge, fct)) + return (void*)CheckBridged(my_lib->w.bridge, fct); #define GO(A) if(my_exterrorhandle_##A == fct) return (void*)my_exterrorhandle_fct_##A; SUPER() #undef GO - return (void*)AddBridge(my_lib->priv.w.bridge, iFppp, fct, 0, NULL); + return (void*)AddBridge(my_lib->w.bridge, iFppp, fct, 0, NULL); } #undef SUPER diff --git a/src/wrapped/wrappedlibz.c b/src/wrapped/wrappedlibz.c index 75f77e96..8d3ebb7a 100755 --- a/src/wrapped/wrappedlibz.c +++ b/src/wrapped/wrappedlibz.c @@ -154,11 +154,9 @@ EXPORT int my_inflate(x64emu_t* emu, void* str, int flush) #define CUSTOM_INIT \ - box64->zlib = lib; \ getMy(lib); #define CUSTOM_FINI \ - freeMy(); \ - ((box64context_t*)(lib->context))->zlib = NULL; + freeMy(); #include "wrappedlib_init.h" diff --git a/src/wrapped/wrappednss3.c b/src/wrapped/wrappednss3.c index e2655aef..2b10bb41 100755 --- a/src/wrapped/wrappednss3.c +++ b/src/wrapped/wrappednss3.c @@ -80,12 +80,12 @@ static void* find_CERT_StringFromCertFcn_Fct(void* fct) static void* reverse_CERT_StringFromCertFcn_Fct(library_t* lib, void* fct) { if(!fct) return fct; - if(CheckBridged(lib->priv.w.bridge, fct)) - return (void*)CheckBridged(lib->priv.w.bridge, fct); + if(CheckBridged(lib->w.bridge, fct)) + return (void*)CheckBridged(lib->w.bridge, fct); #define GO(A) if(my_CERT_StringFromCertFcn_##A == fct) return (void*)my_CERT_StringFromCertFcn_fct_##A; SUPER() #undef GO - return (void*)AddBridge(lib->priv.w.bridge, pFp, fct, 0, NULL); + return (void*)AddBridge(lib->w.bridge, pFp, fct, 0, NULL); } // CERTChainVerifyCallbackFunc ... #define GO(A) \ @@ -112,12 +112,12 @@ static void* find_CERTChainVerifyCallbackFunc_Fct(void* fct) static void* reverse_CERTChainVerifyCallbackFunc_Fct(library_t* lib, void* fct) { if(!fct) return fct; - if(CheckBridged(lib->priv.w.bridge, fct)) - return (void*)CheckBridged(lib->priv.w.bridge, fct); + if(CheckBridged(lib->w.bridge, fct)) + return (void*)CheckBridged(lib->w.bridge, fct); #define GO(A) if(my_CERTChainVerifyCallbackFunc_##A == fct) return (void*)my_CERTChainVerifyCallbackFunc_fct_##A; SUPER() #undef GO - return (void*)AddBridge(lib->priv.w.bridge, iFppp, fct, 0, NULL); + return (void*)AddBridge(lib->w.bridge, iFppp, fct, 0, NULL); } #undef SUPER diff --git a/src/wrapped/wrappedpulse.c b/src/wrapped/wrappedpulse.c index 688671dc..02233aa0 100755 --- a/src/wrapped/wrappedpulse.c +++ b/src/wrapped/wrappedpulse.c @@ -826,7 +826,7 @@ static void* my_io_new(void* api, int fd, int events, void* cb, void *userdata) return ((pFpiipp_t)fnc)(api, fd, events, cb, userdata); } - bridge_t* bridge = my_context->pulse->priv.w.bridge; + bridge_t* bridge = my_lib->w.bridge; if(cb) b = AddCheckBridge(bridge, vFppiip, cb, 0, NULL); if(api==my_mainloop_orig) api=my_mainloop_ref; // need emulated version @@ -857,7 +857,7 @@ static void my_io_set_destroy(void* e, void* cb) if(fnc) return ((vFpp_t)fnc)(e, cb); - bridge_t* bridge = my_context->pulse->priv.w.bridge; + bridge_t* bridge = my_lib->w.bridge; uintptr_t b = 0; if(cb) { b = CheckBridged(bridge, cb); @@ -878,7 +878,7 @@ static void* my_time_new(void* api, void* tv, void* cb, void* data) } // need to bridge the callback! - bridge_t* bridge = my_context->pulse->priv.w.bridge; + bridge_t* bridge = my_lib->w.bridge; if(cb) b = AddCheckBridge(bridge, vFpppp, cb, 0, NULL); if(api==my_mainloop_orig) api=my_mainloop_ref; // need emulated version @@ -909,7 +909,7 @@ static void my_time_set_destroy(void* e, void* cb) if(fnc) return ((vFpp_t)fnc)(e, cb); - bridge_t* bridge = my_context->pulse->priv.w.bridge; + bridge_t* bridge = my_lib->w.bridge; uintptr_t b = 0; if(cb) b = AddCheckBridge(bridge, vFppp, cb, 0, NULL); @@ -927,7 +927,7 @@ static void* my_defer_new(void* api, void* cb, void* data) } // need to bridge the callback! - bridge_t* bridge = my_context->pulse->priv.w.bridge; + bridge_t* bridge = my_lib->w.bridge; if(cb) { b = CheckBridged(bridge, cb); if(!b) @@ -961,7 +961,7 @@ static void my_defer_set_destroy(void* e, void* cb) if(fnc) return ((vFpp_t)fnc)(e, cb); - bridge_t* bridge = my_context->pulse->priv.w.bridge; + bridge_t* bridge = my_lib->w.bridge; uintptr_t b = 0; if(cb) b = AddCheckBridge(bridge, vFppp, cb, 0, NULL); @@ -1027,7 +1027,7 @@ EXPORT void my_pa_mainloop_free(x64emu_t* emu, void* mainloop) EXPORT void* my_pa_mainloop_get_api(x64emu_t* emu, void* mainloop) { my_pa_mainloop_api_t* api = my->pa_mainloop_get_api(mainloop); - bridgeMainloopAPI(my_lib->priv.w.bridge, api); + bridgeMainloopAPI(my_lib->w.bridge, api); return my_mainloop_ref; } @@ -1040,7 +1040,7 @@ EXPORT void my_pa_threaded_mainloop_free(x64emu_t* emu, void* mainloop) EXPORT void* my_pa_threaded_mainloop_get_api(x64emu_t* emu, void* mainloop) { my_pa_mainloop_api_t* api = my->pa_threaded_mainloop_get_api(mainloop); - bridgeMainloopAPI(my_lib->priv.w.bridge, api); + bridgeMainloopAPI(my_lib->w.bridge, api); return my_mainloop_ref; } @@ -1271,7 +1271,7 @@ EXPORT void my_pa_stream_set_read_callback(x64emu_t* emu, void* stream, void* cb EXPORT int my_pa_stream_write(x64emu_t* emu, void* stream, void* d, size_t nbytes, void* cb, int64_t offset, int seek) { - if(!emu->context->pulse) + if(!my_lib) return 0; if(!my) return 0; @@ -1484,12 +1484,10 @@ EXPORT void* my_pa_context_get_source_output_info(x64emu_t* emu, void* c, uint32 return -1; #define CUSTOM_INIT \ - getMy(lib); \ - box64->pulse = lib; + getMy(lib); #define CUSTOM_FINI \ - lib->context->pulse = NULL; \ freeMy(); #include "wrappedlib_init.h" diff --git a/src/wrapped/wrappedsdl1.c b/src/wrapped/wrappedsdl1.c index 6341c9cb..97353568 100755 --- a/src/wrapped/wrappedsdl1.c +++ b/src/wrapped/wrappedsdl1.c @@ -136,13 +136,12 @@ static void* find_EvtFilter_Fct(void* fct) static void* reverse_EvtFilterFct(void* fct) { if(!fct) return fct; - library_t* my_lib = my_context->sdl1lib; - if(CheckBridged(my_lib->priv.w.bridge, fct)) - return (void*)CheckBridged(my_lib->priv.w.bridge, fct); + if(CheckBridged(my_lib->w.bridge, fct)) + return (void*)CheckBridged(my_lib->w.bridge, fct); #define GO(A) if(my_EvtFilter_##A == fct) return (void*)my_EvtFilter_fct_##A; SUPER() #undef GO - return (void*)AddBridge(my_lib->priv.w.bridge, iFp, fct, 0, NULL); + return (void*)AddBridge(my_lib->w.bridge, iFp, fct, 0, NULL); } #undef SUPER @@ -454,7 +453,6 @@ EXPORT int32_t my_SDL_GetWMInfo(x64emu_t* emu, void* p) } #define CUSTOM_INIT \ - box64->sdl1lib = lib; \ getMy(lib); \ box64->sdl1allocrw = my->SDL_AllocRW; \ box64->sdl1freerw = my->SDL_FreeRW; \ @@ -464,10 +462,9 @@ EXPORT int32_t my_SDL_GetWMInfo(x64emu_t* emu, void* p) "librt.so.1"); #define CUSTOM_FINI \ - my->SDL_Quit(); \ - freeMy(); \ - ((box64context_t*)(lib->context))->sdl1lib = NULL; \ - ((box64context_t*)(lib->context))->sdl1allocrw = NULL; \ - ((box64context_t*)(lib->context))->sdl1freerw = NULL; + my->SDL_Quit(); \ + freeMy(); \ + my_context->sdl1allocrw = NULL; \ + my_context->sdl1freerw = NULL; #include "wrappedlib_init.h" diff --git a/src/wrapped/wrappedsdl1mixer.c b/src/wrapped/wrappedsdl1mixer.c index fa4ea1a8..9538aacf 100755 --- a/src/wrapped/wrappedsdl1mixer.c +++ b/src/wrapped/wrappedsdl1mixer.c @@ -214,6 +214,6 @@ EXPORT int my_Mix_UnregisterEffect(x64emu_t* emu, int channel, void* f) #define CUSTOM_FINI \ freeMy(); \ - ((box64context_t*)(lib->context))->sdl1mixerlib = NULL; + my_context->sdl1mixerlib = NULL; #include "wrappedlib_init.h" diff --git a/src/wrapped/wrappedsdl2.c b/src/wrapped/wrappedsdl2.c index 9f02e549..6de8b907 100755 --- a/src/wrapped/wrappedsdl2.c +++ b/src/wrapped/wrappedsdl2.c @@ -173,12 +173,12 @@ static void* find_eventfilter_Fct(void* fct) static void* reverse_eventfilter_Fct(void* fct) { if(!fct) return fct; - if(CheckBridged(my_context->sdl2lib->priv.w.bridge, fct)) - return (void*)CheckBridged(my_context->sdl2lib->priv.w.bridge, fct); + if(CheckBridged(my_lib->w.bridge, fct)) + return (void*)CheckBridged(my_lib->w.bridge, fct); #define GO(A) if(my_eventfilter_##A == fct) return (void*)my_eventfilter_fct_##A; SUPER() #undef GO - return (void*)AddBridge(my_context->sdl2lib->priv.w.bridge, iFpp, fct, 0, NULL); + return (void*)AddBridge(my_lib->w.bridge, iFpp, fct, 0, NULL); } // LogOutput @@ -206,12 +206,12 @@ static void* find_LogOutput_Fct(void* fct) static void* reverse_LogOutput_Fct(void* fct) { if(!fct) return fct; - if(CheckBridged(my_context->sdl2lib->priv.w.bridge, fct)) - return (void*)CheckBridged(my_context->sdl2lib->priv.w.bridge, fct); + if(CheckBridged(my_lib->w.bridge, fct)) + return (void*)CheckBridged(my_lib->w.bridge, fct); #define GO(A) if(my_LogOutput_##A == fct) return (void*)my_LogOutput_fct_##A; SUPER() #undef GO - return (void*)AddBridge(my_context->sdl2lib->priv.w.bridge, vFpiip, fct, 0, NULL); + return (void*)AddBridge(my_lib->w.bridge, vFpiip, fct, 0, NULL); } #undef SUPER @@ -532,14 +532,14 @@ static int get_sdl_priv(x64emu_t* emu, const char *sym_str, void **w, void **f) else if (strcmp(#sym, sym_str) == 0) \ { \ *w = _w; \ - *f = dlsym(emu->context->sdl2lib->priv.w.lib, #sym); \ + *f = dlsym(emu->context->sdl2lib->w.lib, #sym); \ return *f != NULL; \ } #define GO2(sym, _w, sym2) \ else if (strcmp(#sym, sym_str) == 0) \ { \ *w = _w; \ - *f = dlsym(emu->context->sdl2lib->priv.w.lib, #sym2); \ + *f = dlsym(emu->context->sdl2lib->w.lib, #sym2); \ return *f != NULL; \ } #define GOM(sym, _w) \ @@ -575,7 +575,7 @@ int EXPORT my2_SDL_DYNAPI_entry(x64emu_t* emu, uint32_t version, uintptr_t *tabl void *w = NULL; \ void *f = NULL; \ if (get_sdl_priv(emu, #sym, &w, &f)) { \ - table[i] = AddCheckBridge(my_context->sdl2lib->priv.w.bridge, w, f, 0, #sym); \ + table[i] = AddCheckBridge(my_lib->w.bridge, w, f, 0, #sym); \ } \ else \ table[i] = (uintptr_t)NULL; \ @@ -847,7 +847,7 @@ EXPORT void* my2_SDL_Vulkan_GetVkGetInstanceProcAddr(x64emu_t* emu) emu->context->vkprocaddress = (vkprocaddess_t)my->SDL_Vulkan_GetVkGetInstanceProcAddr(); if(emu->context->vkprocaddress) - return (void*)AddCheckBridge(my_context->sdl2lib->priv.w.bridge, pFEpp, my_vkGetInstanceProcAddr, 0, "vkGetInstanceProcAddr"); + return (void*)AddCheckBridge(my_lib->w.bridge, pFEpp, my_vkGetInstanceProcAddr, 0, "vkGetInstanceProcAddr"); return NULL; } @@ -888,9 +888,9 @@ EXPORT void my2_SDL_GetJoystickGUIDInfo(SDL_JoystickGUID guid, uint16_t *vend, u if(my_glhandle) my_dlclose(thread_get_emu(), my_glhandle); \ my_glhandle = NULL; \ freeMy(); \ - ((box64context_t*)(lib->context))->sdl2lib = NULL; \ - ((box64context_t*)(lib->context))->sdl2allocrw = NULL; \ - ((box64context_t*)(lib->context))->sdl2freerw = NULL; + my_context->sdl2lib = NULL; \ + my_context->sdl2allocrw = NULL; \ + my_context->sdl2freerw = NULL; #include "wrappedlib_init.h" diff --git a/src/wrapped/wrappedsdl2mixer.c b/src/wrapped/wrappedsdl2mixer.c index c0c5af5f..8bf9c4df 100755 --- a/src/wrapped/wrappedsdl2mixer.c +++ b/src/wrapped/wrappedsdl2mixer.c @@ -232,6 +232,6 @@ EXPORT int my2_MinorityMix_SetPosition(x64emu_t* emu, int channel, int16_t angle #define CUSTOM_FINI \ freeMy(); \ - ((box64context_t*)(lib->context))->sdl2mixerlib = NULL; + my_context->sdl2mixerlib = NULL; #include "wrappedlib_init.h" diff --git a/src/wrapped/wrappedtcmallocminimal.c b/src/wrapped/wrappedtcmallocminimal.c index 20b2ccc0..4f179cf0 100755 --- a/src/wrapped/wrappedtcmallocminimal.c +++ b/src/wrapped/wrappedtcmallocminimal.c @@ -17,7 +17,7 @@ const char* tcmallocminimalName = "libtcmalloc_minimal.so.4"; // this preinit basically open "box86" as dlopen (because libtcmalloc_minimal needs to be LD_PRELOAD for it to work) #define PRE_INIT\ - lib->priv.w.lib = dlopen(NULL, RTLD_LAZY | RTLD_GLOBAL); \ + lib->w.lib = dlopen(NULL, RTLD_LAZY | RTLD_GLOBAL); \ if(0) #include "wrappedlib_init.h" diff --git a/src/wrapped/wrappedunwind.c b/src/wrapped/wrappedunwind.c index ba503be2..c0aeba37 100644 --- a/src/wrapped/wrappedunwind.c +++ b/src/wrapped/wrappedunwind.c @@ -36,7 +36,7 @@ EXPORT int my__ULx86_64_init_local(x64emu_t* emu, void* cursor, void* ctx) { #define PRE_INIT \ if(1) \ - lib->priv.w.lib = dlopen(NULL, RTLD_LAZY | RTLD_GLOBAL);\ + lib->w.lib = dlopen(NULL, RTLD_LAZY | RTLD_GLOBAL);\ else diff --git a/src/wrapped/wrappedutil.c b/src/wrapped/wrappedutil.c index 68f5757a..3c2442a3 100755 --- a/src/wrapped/wrappedutil.c +++ b/src/wrapped/wrappedutil.c @@ -28,7 +28,7 @@ EXPORT pid_t my_forkpty(x64emu_t* emu, void* amaster, void* name, void* termp, v forkinfo.termp = termp; forkinfo.winp = winp; library_t* lib = GetLibInternal(utilName); - forkinfo.f = dlsym(lib->priv.w.lib, "forkpty"); + forkinfo.f = dlsym(lib->w.lib, "forkpty"); emu->quit = 1; emu->fork = 2; diff --git a/src/wrapped/wrappedvorbisfile.c b/src/wrapped/wrappedvorbisfile.c index 768c06a6..ad285fe7 100755 --- a/src/wrapped/wrappedvorbisfile.c +++ b/src/wrapped/wrappedvorbisfile.c @@ -166,12 +166,10 @@ EXPORT int32_t my_ov_test_callbacks(x64emu_t* emu, void* datasource, void* vf, v #endif #define CUSTOM_INIT \ - box64->vorbisfile = lib;\ getMy(lib); #define CUSTOM_FINI \ - freeMy(); \ - my_context->vorbisfile = NULL; + freeMy(); #include "wrappedlib_init.h" diff --git a/src/wrapped/wrappedvulkan.c b/src/wrapped/wrappedvulkan.c index 074082d8..21d9ea8c 100755 --- a/src/wrapped/wrappedvulkan.c +++ b/src/wrapped/wrappedvulkan.c @@ -325,7 +325,7 @@ static void* find_DebugReportCallbackEXT_Fct(void* fct) #undef SUPER -//#define PRE_INIT if(libGL) {lib->priv.w.lib = dlopen(libGL, RTLD_LAZY | RTLD_GLOBAL); lib->path = strdup(libGL);} else +//#define PRE_INIT if(libGL) {lib->w.lib = dlopen(libGL, RTLD_LAZY | RTLD_GLOBAL); lib->path = strdup(libGL);} else #define PRE_INIT \ if(box64_novulkan) \ @@ -333,8 +333,8 @@ static void* find_DebugReportCallbackEXT_Fct(void* fct) #define CUSTOM_INIT \ getMy(lib); \ - lib->priv.w.priv = dlsym(lib->priv.w.lib, "vkGetInstanceProcAddr"); \ - box64->vkprocaddress = lib->priv.w.priv; + lib->w.priv = dlsym(lib->w.lib, "vkGetInstanceProcAddr"); \ + box64->vkprocaddress = lib->w.priv; #define CUSTOM_FINI \ freeMy(); diff --git a/src/wrapped/wrappedwaylandclient.c b/src/wrapped/wrappedwaylandclient.c index 5335f30f..c1570cf2 100644 --- a/src/wrapped/wrappedwaylandclient.c +++ b/src/wrapped/wrappedwaylandclient.c @@ -21,10 +21,4 @@ const char* waylandclientName = "libwayland-client.so.0"; #define LIBNAME waylandclient -#define CUSTOM_INIT \ - box64->vorbis = lib; - -#define CUSTOM_FINI \ - lib->context->vorbis = NULL; - #include "wrappedlib_init.h" diff --git a/src/wrapped/wrappedwaylandcursor.c b/src/wrapped/wrappedwaylandcursor.c index b62a4181..8ce68fb1 100644 --- a/src/wrapped/wrappedwaylandcursor.c +++ b/src/wrapped/wrappedwaylandcursor.c @@ -21,10 +21,4 @@ const char* waylandcursorName = "libwayland-cursor.so.0"; #define LIBNAME waylandcursor -#define CUSTOM_INIT \ - box64->vorbis = lib; - -#define CUSTOM_FINI \ - lib->context->vorbis = NULL; - #include "wrappedlib_init.h" diff --git a/src/wrapped/wrappedwaylandegl.c b/src/wrapped/wrappedwaylandegl.c index d7c0dd29..5b696af1 100644 --- a/src/wrapped/wrappedwaylandegl.c +++ b/src/wrapped/wrappedwaylandegl.c @@ -21,10 +21,4 @@ const char* waylandeglName = "libwayland-egl.so.1"; #define LIBNAME waylandegl -#define CUSTOM_INIT \ - box64->vorbis = lib; - -#define CUSTOM_FINI \ - lib->context->vorbis = NULL; - #include "wrappedlib_init.h" diff --git a/src/wrapped/wrappedxml2.c b/src/wrapped/wrappedxml2.c index e8c68206..271edfdd 100755 --- a/src/wrapped/wrappedxml2.c +++ b/src/wrapped/wrappedxml2.c @@ -67,17 +67,17 @@ void* my_wrap_xmlMemStrdup(void* p) #define ADDED_INIT() \ void** p; \ - p=dlsym(lib->priv.w.lib, "xmlFree"); \ - my_xmlFree = (p && *p)?AddBridge(lib->priv.w.bridge, vFp, *p, 0, "my_wrap_xmlFree"):0; \ + p=dlsym(lib->w.lib, "xmlFree"); \ + my_xmlFree = (p && *p)?AddBridge(lib->w.bridge, vFp, *p, 0, "my_wrap_xmlFree"):0; \ if(p) *p = my_wrap_xmlFree; \ - p=dlsym(lib->priv.w.lib, "xmlMalloc"); \ - my_xmlMalloc = (p && *p)?AddBridge(lib->priv.w.bridge, pFL, *p, 0, "my_wrap_xmlMalloc"):0; \ + p=dlsym(lib->w.lib, "xmlMalloc"); \ + my_xmlMalloc = (p && *p)?AddBridge(lib->w.bridge, pFL, *p, 0, "my_wrap_xmlMalloc"):0; \ if(p) *p = my_wrap_xmlMalloc; \ - p=dlsym(lib->priv.w.lib, "xmlRealloc"); \ - my_xmlRealloc = (p && *p)?AddBridge(lib->priv.w.bridge, pFpL, *p, 0, "my_wrap_xmlRealloc"):0; \ + p=dlsym(lib->w.lib, "xmlRealloc"); \ + my_xmlRealloc = (p && *p)?AddBridge(lib->w.bridge, pFpL, *p, 0, "my_wrap_xmlRealloc"):0; \ if(p) *p = my_wrap_xmlRealloc; \ - p=dlsym(lib->priv.w.lib, "xmlMemStrdup"); \ - my_xmlMemStrdup = (p && *p)?AddBridge(lib->priv.w.bridge, pFp, *p, 0, "my_wrap_xmlMemStrdup"):0; \ + p=dlsym(lib->w.lib, "xmlMemStrdup"); \ + my_xmlMemStrdup = (p && *p)?AddBridge(lib->w.bridge, pFp, *p, 0, "my_wrap_xmlMemStrdup"):0; \ if(p) *p = my_wrap_xmlMemStrdup; #include "wrappercallback.h" @@ -1110,12 +1110,12 @@ static void* find_xmlExternalEntityLoaderFct(void* fct) static void* reverse_xmlExternalEntityLoaderFct(void* fct) { if(!fct) return fct; - if(CheckBridged(my_lib->priv.w.bridge, fct)) - return (void*)CheckBridged(my_lib->priv.w.bridge, fct); + if(CheckBridged(my_lib->w.bridge, fct)) + return (void*)CheckBridged(my_lib->w.bridge, fct); #define GO(A) if(my_xmlExternalEntityLoader_##A == fct) return (void*)my_xmlExternalEntityLoader_fct_##A; SUPER() #undef GO - return (void*)AddBridge(my_lib->priv.w.bridge, pFppp, fct, 0, "xmlExternalEntityLoader_callback"); + return (void*)AddBridge(my_lib->w.bridge, pFppp, fct, 0, "xmlExternalEntityLoader_callback"); } diff --git a/src/wrapped/wrappercallback.h b/src/wrapped/wrappercallback.h index 2886965e..b86ed14e 100644 --- a/src/wrapped/wrappercallback.h +++ b/src/wrapped/wrappercallback.h @@ -1,4 +1,3 @@ - #define TYPENAME3(N,M) N##M #define TYPENAME2(N,M) TYPENAME3(N,M) #define TYPENAME(N) TYPENAME2(LIBNAME, _my_t) @@ -19,7 +18,7 @@ static TYPENAME(LIBNAME) * const my = &TYPENAME2(my_, LIBNAME); static void getMy(library_t* lib) { - #define GO(A, W) my->A = (W)dlsym(lib->priv.w.lib, #A); + #define GO(A, W) my->A = (W)dlsym(lib->w.lib, #A); SUPER() #undef GO my_lib = lib; |