diff options
| author | rajdakin <rajdakin@gmail.com> | 2021-07-31 13:36:45 +0200 |
|---|---|---|
| committer | rajdakin <rajdakin@gmail.com> | 2021-07-31 13:36:45 +0200 |
| commit | c8640caba352bed19d7289cf9761c0d14d3d2b19 (patch) | |
| tree | 78534838b40923b18f5207ad3c418c56c9479321 /src/librarian | |
| parent | f4ea86378ee9a9f3ee418069dc8d12a13813cb28 (diff) | |
| download | box64-c8640caba352bed19d7289cf9761c0d14d3d2b19.tar.gz box64-c8640caba352bed19d7289cf9761c0d14d3d2b19.zip | |
Started adding GOWM macro
Diffstat (limited to 'src/librarian')
| -rwxr-xr-x | src/librarian/library.c | 74 | ||||
| -rwxr-xr-x | src/librarian/library_private.h | 1 |
2 files changed, 74 insertions, 1 deletions
diff --git a/src/librarian/library.c b/src/librarian/library.c index 215ac523..06e348ac 100755 --- a/src/librarian/library.c +++ b/src/librarian/library.c @@ -26,7 +26,7 @@ #include "wrappedlibs.h" // create the native lib list #define GO(P, N) int wrapped##N##_init(library_t* lib, box64context_t *box64); \ - void wrapped##N##_fini(library_t* lib);\ + void wrapped##N##_fini(library_t* lib); \ int wrapped##N##_get(library_t* lib, const char* name, uintptr_t *offs, uintptr_t *sz, int version, const char* vername, int local); \ int wrapped##N##_getnoweak(library_t* lib, const char* name, uintptr_t *offs, uintptr_t *sz, int version, const char* vername, int local); #include "library_list.h" @@ -79,12 +79,52 @@ int NbDot(const char* name) return ret; } +void NativeLib_CommonInit(library_t *lib) { + lib->priv.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); +} + void EmuLib_Fini(library_t* lib) { kh_destroy(mapsymbols, lib->priv.n.mapsymbols); kh_destroy(mapsymbols, lib->priv.n.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) + free(lib->priv.w.altprefix); + if(lib->priv.w.neededlibs) { + for(int i=0; i<lib->priv.w.needed; ++i) + free(lib->priv.w.neededlibs[i]); + free(lib->priv.w.neededlibs); + } + FreeBridge(&lib->priv.w.bridge); +} +int WrappedLib_defget(library_t* lib, const char* name, uintptr_t *offs, uintptr_t *sz, int version, const char* vername, int local) { + uintptr_t addr = 0; + uintptr_t size = 0; + if (!getSymbolInMaps(lib, name, 0, &addr, &size, version, vername, local)) { + return 0; + } + if(!addr && !size) + return 0; + *offs = addr; + *sz = size; + return 1; +} int EmuLib_Get(library_t* lib, const char* name, uintptr_t *offs, uintptr_t *sz, int version, const char* vername, int local) { // symbols... @@ -104,6 +144,18 @@ int EmuLib_Get(library_t* lib, const char* name, uintptr_t *offs, uintptr_t *sz, } return 0; } +int WrappedLib_defgetnoweak(library_t* lib, const char* name, uintptr_t *offs, uintptr_t *sz, int version, const char* vername, int local) { + uintptr_t addr = 0; + uintptr_t size = 0; + if (!getSymbolInMaps(lib, name, 1, &addr, &size, version, vername, local)) { + return 0; + } + if(!addr && !size) + return 0; + *offs = addr; + *sz = size; + return 1; +} 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; @@ -430,6 +482,8 @@ void Free1Library(library_t **lib, x64emu_t* emu) 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) @@ -653,6 +707,24 @@ static int getSymbolInSymbolMaps(library_t*lib, const char* name, int noweak, ui return 1; } if(!noweak) { + // check in wmysymbolmap + khint_t k = kh_get(symbolmap, lib->wmysymbolmap, name); + if (k!=kh_end(lib->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); + 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); + *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); diff --git a/src/librarian/library_private.h b/src/librarian/library_private.h index 606e47f8..ebbe1529 100755 --- a/src/librarian/library_private.h +++ b/src/librarian/library_private.h @@ -68,6 +68,7 @@ typedef struct library_s { 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; |