diff options
Diffstat (limited to 'src/librarian')
| -rw-r--r-- | src/librarian/librarian.c | 6 | ||||
| -rw-r--r-- | src/librarian/library.c | 60 | ||||
| -rw-r--r-- | src/librarian/library_private.h | 20 |
3 files changed, 86 insertions, 0 deletions
diff --git a/src/librarian/librarian.c b/src/librarian/librarian.c index 9250a165..9b5e82ac 100644 --- a/src/librarian/librarian.c +++ b/src/librarian/librarian.c @@ -476,8 +476,10 @@ static int GetGlobalSymbolStartEnd_internal(lib_t *maplib, const char* name, uin // nope, not found return weak; } +#ifndef STATICBUILD void** my_GetGTKDisplay(); void** my_GetGthreadsGotInitialized(); +#endif int GetGlobalSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, uintptr_t* end, elfheader_t* self, int version, const char* vername, int veropt, void** elfsym) { if(GetGlobalSymbolStartEnd_internal(maplib, name, start, end, self, &version, &vername, &veropt, elfsym)) { @@ -494,6 +496,7 @@ int GetGlobalSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, u } return 1; } + #ifndef STATICBUILD // some special case symbol, defined inside box64 itself if(!strcmp(name, "gdk_display")) { *start = (uintptr_t)my_GetGTKDisplay(); @@ -507,6 +510,7 @@ int GetGlobalSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, u printf_log(LOG_INFO, "Using global g_threads_got_initialized for gthread2 (%p:%p)\n", start, *(void**)start); return 1; } + #endif // not found... return 0; } @@ -565,6 +569,7 @@ int GetGlobalWeakSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* star } return 1; } + #ifndef STATICBUILD // some special case symbol, defined inside box64 itself if(!strcmp(name, "gdk_display")) { *start = (uintptr_t)my_GetGTKDisplay(); @@ -580,6 +585,7 @@ int GetGlobalWeakSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* star printf_log(LOG_INFO, "Using global g_threads_got_initialized for gthread2 (%p:%p)\n", start, *(void**)start); return 1; } + #endif // not found... return 0; } diff --git a/src/librarian/library.c b/src/librarian/library.c index 6d888fdc..99d884cd 100644 --- a/src/librarian/library.c +++ b/src/librarian/library.c @@ -33,19 +33,31 @@ #define GO(P, N) int wrapped##N##_init(library_t* lib, box64context_t *box64); \ void wrapped##N##_fini(library_t* lib); +#ifdef STATICBUILD +#include "library_list_static.h" +#else #include "library_list.h" +#endif #undef GO #define GO(P, N) {P, wrapped##N##_init, wrapped##N##_fini}, wrappedlib_t wrappedlibs[] = { +#ifdef STATICBUILD +#include "library_list_static.h" +#else #include "library_list.h" +#endif }; #undef GO KHASH_MAP_IMPL_STR(symbolmap, symbol1_t) KHASH_MAP_IMPL_STR(symbol2map, symbol2_t) +#ifdef STATICBUILD +KHASH_MAP_IMPL_STR(datamap, datamap_t) +#else KHASH_MAP_IMPL_STR(datamap, uint64_t) +#endif char* Path2Name(const char* path) { @@ -715,11 +727,19 @@ static int getSymbolInDataMaps(library_t*lib, const char* name, int noweak, uint void* symbol; khint_t k = kh_get(datamap, lib->w.datamap, name); if (k!=kh_end(lib->w.datamap)) { + #ifdef STATICBUILD + symbol = (void*)(kh_value(lib->w.datamap, k).addr); + #else symbol = dlsym(lib->w.lib, kh_key(lib->w.datamap, k)); + #endif if(symbol) { // found! *addr = (uintptr_t)symbol; + #ifdef STATICBUILD + *size = kh_value(lib->w.datamap, k).size; + #else *size = kh_value(lib->w.datamap, k); + #endif *weak = 0; return 1; } @@ -727,11 +747,19 @@ static int getSymbolInDataMaps(library_t*lib, const char* name, int noweak, uint if(!noweak) { k = kh_get(datamap, lib->w.wdatamap, name); if (k!=kh_end(lib->w.wdatamap)) { + #ifdef STATICBUILD + symbol = (void*)(kh_value(lib->w.wdatamap, k).addr); + #else symbol = dlsym(lib->w.lib, kh_key(lib->w.wdatamap, k)); + #endif if(symbol) { // found! *addr = (uintptr_t)symbol; + #ifdef STATICBUILD + *size = kh_value(lib->w.wdatamap, k).size; + #else *size = kh_value(lib->w.wdatamap, k); + #endif *weak = 1; return 1; } @@ -746,13 +774,21 @@ static int getSymbolInDataMaps(library_t*lib, const char* name, int noweak, uint else strcpy(buff, "my_"); strcat(buff, name); + #ifdef STATICBUILD + symbol = kh_value(lib->w.mydatamap, k).addr; + #else symbol = dlsym(my_context->box64lib, buff); + #endif if(!symbol) printf_log(LOG_NONE, "Warning, data %s not found\n", buff); if(symbol) { // found! *addr = (uintptr_t)symbol; + #ifdef STATICBUILD + *size = kh_value(lib->w.mydatamap, k).size; + #else *size = kh_value(lib->w.mydatamap, k); + #endif *weak = 0; return 1; } @@ -773,7 +809,11 @@ static int getSymbolInSymbolMaps(library_t*lib, const char* name, int noweak, ui else strcpy(buff, "my_"); strcat(buff, name); + #ifdef STATICBUILD + symbol = (void*)s->addr; + #else symbol = dlsym(my_context->box64lib, buff); + #endif if(!symbol) { printf_log(LOG_NONE, "Warning, function %s not found\n", buff); return 0; @@ -797,7 +837,11 @@ static int getSymbolInSymbolMaps(library_t*lib, const char* name, int noweak, ui else strcpy(buff, "my_"); strcat(buff, name); + #ifdef STATICBUILD + symbol = (void*)s->addr; + #else symbol = dlsym(my_context->box64lib, buff); + #endif if(!symbol) { printf_log(LOG_NONE, "Warning, function %s not found\n", buff); return 0; @@ -815,6 +859,9 @@ static int getSymbolInSymbolMaps(library_t*lib, const char* name, int noweak, ui if (k!=kh_end(lib->w.symbolmap)) { symbol1_t *s = &kh_value(lib->w.symbolmap, k); if(!s->resolved) { + #ifdef STATICBUILD + symbol = (void*)s->addr; + #else symbol = dlsym(lib->w.lib, name); if(!symbol && lib->w.altprefix) { char newname[200]; @@ -830,6 +877,7 @@ static int getSymbolInSymbolMaps(library_t*lib, const char* name, int noweak, ui strcat(newname, name); symbol = GetNativeSymbolUnversioned(lib->w.lib, newname); } + #endif if(!symbol) { printf_dump(LOG_INFO, "Warning, function %s not found in lib %s\n", name, lib->name); return 0; @@ -854,7 +902,11 @@ static int getSymbolInSymbolMaps(library_t*lib, const char* name, int noweak, ui else strcpy(buff, "my_"); strcat(buff, name); + #ifdef STATICBUILD + symbol = (void*)s->addr; + #else symbol = dlsym(my_context->box64lib, buff); + #endif if(!symbol) { printf_log(LOG_NONE, "Warning, function %s not found\n", buff); return 0; @@ -871,6 +923,9 @@ static int getSymbolInSymbolMaps(library_t*lib, const char* name, int noweak, ui if (k!=kh_end(lib->w.wsymbolmap)) { symbol1_t *s = &kh_value(lib->w.wsymbolmap, k); if(!s->resolved) { + #ifdef STATICBUILD + symbol = (void*)s->addr; + #else symbol = dlsym(lib->w.lib, name); if(!symbol && lib->w.altprefix) { char newname[200]; @@ -886,6 +941,7 @@ static int getSymbolInSymbolMaps(library_t*lib, const char* name, int noweak, ui strcat(newname, name); symbol = GetNativeSymbolUnversioned(lib->w.lib, newname); } + #endif if(!symbol) { printf_dump(LOG_INFO, "Warning, function %s not found in lib %s\n", name, lib->name); return 0; @@ -906,11 +962,15 @@ static int getSymbolInSymbolMaps(library_t*lib, const char* name, int noweak, ui if(!noweak || !s->weak) { if(!s->resolved) { + #ifdef STATICBUILD + symbol = (void*)s->addr; + #else symbol = dlsym(lib->w.lib, kh_value(lib->w.symbol2map, k).name); if(!symbol) symbol = dlsym(RTLD_DEFAULT, kh_value(lib->w.symbol2map, k).name); // search globaly maybe if(!symbol) symbol = GetNativeSymbolUnversioned(lib->w.lib, kh_value(lib->w.symbol2map, k).name); + #endif if(!symbol) { printf_dump(LOG_INFO, "Warning, function %s not found in lib %s\n", kh_value(lib->w.symbol2map, k).name, lib->name); return 0; diff --git a/src/librarian/library_private.h b/src/librarian/library_private.h index 1da4c264..a13df4a0 100644 --- a/src/librarian/library_private.h +++ b/src/librarian/library_private.h @@ -30,9 +30,20 @@ typedef struct symbol2_s { uintptr_t addr; } symbol2_t; +#ifdef STATICBUILD +typedef struct datamap_s { + uint64_t size; + uintptr_t addr; +} datamap_t; +#endif + KHASH_MAP_DECLARE_STR(symbolmap, symbol1_t) KHASH_MAP_DECLARE_STR(symbol2map, symbol2_t) +#ifdef STATICBUILD +KHASH_MAP_DECLARE_STR(datamap, datamap_t) +#else KHASH_MAP_DECLARE_STR(datamap, uint64_t) +#endif #ifndef MAX_PATH @@ -88,17 +99,26 @@ typedef struct map_onesymbol_s { const char* name; wrapper_t w; int weak; +#ifdef STATICBUILD + void* addr; +#endif } map_onesymbol_t; typedef struct map_onesymbol2_s { const char* name; wrapper_t w; int weak; const char* name2; +#ifdef STATICBUILD + void* addr; +#endif } map_onesymbol2_t; typedef struct map_onedata_s { const char* name; uint32_t sz; // TODO: convert to size_t int weak; +#ifdef STATICBUILD + void* addr; +#endif } map_onedata_t; int getSymbolInMaps(library_t *lib, const char* name, int noweak, uintptr_t *addr, uintptr_t *size, int *weak, int version, const char* vername, int local, int veropt); // Add bridges to functions |