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 | |
| parent | f4ea86378ee9a9f3ee418069dc8d12a13813cb28 (diff) | |
| download | box64-c8640caba352bed19d7289cf9761c0d14d3d2b19.tar.gz box64-c8640caba352bed19d7289cf9761c0d14d3d2b19.zip | |
Started adding GOWM macro
Diffstat (limited to 'src')
| -rwxr-xr-x | src/librarian/library.c | 74 | ||||
| -rwxr-xr-x | src/librarian/library_private.h | 1 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlib_init.h | 128 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlib_undefs.h | 23 |
4 files changed, 134 insertions, 92 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; diff --git a/src/wrapped/wrappedlib_init.h b/src/wrapped/wrappedlib_init.h index d991f8a2..9e69d5a2 100755 --- a/src/wrapped/wrappedlib_init.h +++ b/src/wrapped/wrappedlib_init.h @@ -12,38 +12,50 @@ #define MAPNAME2(N,M) MAPNAME3(N,M) #define MAPNAME(N) MAPNAME2(LIBNAME,N) // prepare the maps +// regular symbol mapped to itself #define GO(N, W) +// regular symbol mapped to itself, but weak #define GOW(N, W) +// symbol mapped to my_symbol #define GOM(N, W) +// symbol mapped to my_symbol, but weak +#define GOWM(N, W) +// regular symbol mapped to itself, that returns a structure #define GOS(N, W) +// symbol mapped to another one #define GO2(N, W, O) +// data #define DATA(N, S) +// data, Weak (type V) #define DATAV(N, S) +// data, Uninitialized (type B) #define DATAB(N, S) +// data, "my_" type #define DATAM(N, S) // #define the 4 maps first #undef GO #define GO(N, W) {#N, W, 0}, +#undef GOW +#define GOW(N, W) {#N, W, 1}, static const map_onesymbol_t MAPNAME(symbolmap)[] = { #include PRIVATE(LIBNAME) }; #undef GO #define GO(N, W) #undef GOW -#define GOW(N, W) {#N, W, 1}, -static const map_onesymbol_t MAPNAME(wsymbolmap)[] = { - #include PRIVATE(LIBNAME) -}; -#undef GOW #define GOW(N, W) #undef GOM #define GOM(N, W) {#N, W, 0}, +#undef GOWM +#define GOWM(N, W) {#N, W, 1}, static const map_onesymbol_t MAPNAME(mysymbolmap)[] = { #include PRIVATE(LIBNAME) }; #undef GOM #define GOM(N, W) +#undef GOWM +#define GOWM(N, W) #undef GOS #define GOS(N, W) {#N, W, 0}, static const map_onesymbol_t MAPNAME(stsymbolmap)[] = { @@ -78,10 +90,20 @@ static const map_onedata_t MAPNAME(datamap)[] = { static const map_onedata_t MAPNAME(mydatamap)[] = { #include PRIVATE(LIBNAME) }; -#include "wrappedlib_undefs.h" +#undef GO +#undef GOW +#undef GOM +#undef GOWM +#undef GO2 +#undef GOS +#undef DATA +#undef DATAV +#undef DATAB +#undef DATAM +void NativeLib_CommonInit(library_t *lib); int FUNC(_init)(library_t* lib, box64context_t* box64) { (void)box64; @@ -110,43 +132,29 @@ int FUNC(_init)(library_t* lib, box64context_t* box64) #endif } else lib->path = strdup(MAPNAME(Name)); } - lib->priv.w.bridge = NewBridge(); -// Create maps - lib->symbolmap = kh_init(symbolmap); - lib->wsymbolmap = kh_init(symbolmap); - lib->mysymbolmap = 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); + NativeLib_CommonInit(lib); khint_t k; int ret; int cnt; // populates maps... - cnt = sizeof(MAPNAME(symbolmap))/sizeof(map_onesymbol_t); - for (int i=0; i<cnt; ++i) { - k = kh_put(symbolmap, lib->symbolmap, MAPNAME(symbolmap)[i].name, &ret); - kh_value(lib->symbolmap, k) = MAPNAME(symbolmap)[i].w; - if(strchr(MAPNAME(symbolmap)[i].name, '@')) - AddDictionnary(box64->versym, MAPNAME(symbolmap)[i].name); - } - cnt = sizeof(MAPNAME(wsymbolmap))/sizeof(map_onesymbol_t); - for (int i=0; i<cnt; ++i) { - k = kh_put(symbolmap, lib->wsymbolmap, MAPNAME(wsymbolmap)[i].name, &ret); - kh_value(lib->wsymbolmap, k) = MAPNAME(wsymbolmap)[i].w; - if(strchr(MAPNAME(wsymbolmap)[i].name, '@')) - AddDictionnary(box64->versym, MAPNAME(wsymbolmap)[i].name); - } - cnt = sizeof(MAPNAME(mysymbolmap))/sizeof(map_onesymbol_t); - for (int i=0; i<cnt; ++i) { - k = kh_put(symbolmap, lib->mysymbolmap, MAPNAME(mysymbolmap)[i].name, &ret); - kh_value(lib->mysymbolmap, k) = MAPNAME(mysymbolmap)[i].w; - if(strchr(MAPNAME(mysymbolmap)[i].name, '@')) - AddDictionnary(box64->versym, MAPNAME(mysymbolmap)[i].name); - } +#define DOIT(mapname) \ + 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; \ + } else { \ + k = kh_put(symbolmap, lib->mapname, MAPNAME(mapname)[i].name, &ret); \ + kh_value(lib->mapname, k) = MAPNAME(mapname)[i].w; \ + } \ + if (strchr(MAPNAME(mapname)[i].name, '@')) \ + AddDictionnary(box64->versym, MAPNAME(mapname)[i].name); \ + } + DOIT(symbolmap) + DOIT(mysymbolmap) +#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); @@ -185,67 +193,51 @@ int FUNC(_init)(library_t* lib, box64context_t* box64) return 0; } -int FUNC(_fini)(library_t* lib) +void NativeLib_FinishFini(library_t* lib); +void FUNC(_fini)(library_t* lib) { #ifdef CUSTOM_FINI CUSTOM_FINI #endif - 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); - return 1; + NativeLib_FinishFini(lib); } +int WrappedLib_defget(library_t* lib, const char* name, uintptr_t *offs, uintptr_t *sz, int version, const char* vername, int local); int FUNC(_get)(library_t* lib, const char* name, uintptr_t *offs, uintptr_t *sz, int version, const char* vername, int local) { +#ifdef CUSTOM_FAIL uintptr_t addr = 0; uintptr_t size = 0; -#ifdef CUSTOM_FAIL void* symbol = NULL; -#endif -//PRE if (!getSymbolInMaps(lib, name, 0, &addr, &size, version, vername, local)) { -#ifdef CUSTOM_FAIL - CUSTOM_FAIL -#else - return 0; -#endif + CUSTOM_FAIL } -//POST if(!addr && !size) return 0; *offs = addr; *sz = size; return 1; +#else + return WrappedLib_defget(lib, name, offs, sz, version, vername, local); +#endif } +int WrappedLib_defgetnoweak(library_t* lib, const char* name, uintptr_t *offs, uintptr_t *sz, int version, const char* vername, int local); int FUNC(_getnoweak)(library_t* lib, const char* name, uintptr_t *offs, uintptr_t *sz, int version, const char* vername, int local) { +#ifdef CUSTOM_FAIL uintptr_t addr = 0; uintptr_t size = 0; -#ifdef CUSTOM_FAIL void* symbol = NULL; -#endif -//PRE if (!getSymbolInMaps(lib, name, 1, &addr, &size, version, vername, local)) { -#ifdef CUSTOM_FAIL - CUSTOM_FAIL -#else - return 0; -#endif + CUSTOM_FAIL } -//POST if(!addr && !size) return 0; *offs = addr; *sz = size; return 1; +#else + return WrappedLib_defgetnoweak(lib, name, offs, sz, version, vername, local); +#endif } diff --git a/src/wrapped/wrappedlib_undefs.h b/src/wrapped/wrappedlib_undefs.h deleted file mode 100755 index 7c6ac84b..00000000 --- a/src/wrapped/wrappedlib_undefs.h +++ /dev/null @@ -1,23 +0,0 @@ -// regular symbol mapped to itself -#undef GO - -// regular symbol mapped to itself, but weak (unimplemented for now) -#undef GOW - -// symbol mapped to my_symbol -#undef GOM - -// symbol mapped to another one -#undef GO2 - -// data -#undef DATA - -// data, Weak (type V) -#undef DATAV - -// data, Uninitialized (type B) -#undef DATAB - -// data, "my_" type -#undef DATAM |