diff options
Diffstat (limited to 'src/wrapped/wrappedlib_init.h')
| -rw-r--r-- | src/wrapped/wrappedlib_init.h | 91 |
1 files changed, 84 insertions, 7 deletions
diff --git a/src/wrapped/wrappedlib_init.h b/src/wrapped/wrappedlib_init.h index 44af7c90..3505efd3 100644 --- a/src/wrapped/wrappedlib_init.h +++ b/src/wrapped/wrappedlib_init.h @@ -43,36 +43,54 @@ // #define the 4 maps first #undef GO -#define GO(N, W) {#N, W, 0}, #undef GOW +#ifdef STATICBUILD +#define GO(N, W) {#N, W, 0, &N}, +#define GOW(N, W) {#N, W, 1, &N}, +#else +#define GO(N, W) {#N, W, 0}, #define GOW(N, W) {#N, W, 1}, +#endif static const map_onesymbol_t MAPNAME(symbolmap)[] = { #include PRIVATE(LIBNAME) }; #undef GO -#define GO(N, W) #undef GOW -#define GOW(N, W) #undef GOM -#define GOM(N, W) {#N, W, 0}, #undef GOWM +#define GO(N, W) +#define GOW(N, W) +#ifdef STATICBUILD +#define GOM(N, W) {#N, W, 0, &my_##N}, +#define GOWM(N, W) {#N, W, 1, &my_##N}, +#else +#define GOM(N, W) {#N, W, 0}, #define GOWM(N, W) {#N, W, 1}, +#endif 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 GOM(N, W) +#define GOWM(N, W) +#ifdef STATICBUILD +#define GOS(N, W) {#N, W, 0, &my_##N}, +#else #define GOS(N, W) {#N, W, 0}, +#endif static const map_onesymbol_t MAPNAME(stsymbolmap)[] = { #include PRIVATE(LIBNAME) }; #undef GOS -#define GOS(N, W) #undef GO2 +#define GOS(N, W) +#ifdef STATICBUILD +#define GO2(N, W, O) {#N, W, 0, #O, &O}, +#else #define GO2(N, W, O) {#N, W, 0, #O}, +#endif static const map_onesymbol2_t MAPNAME(symbol2map)[] = { #include PRIVATE(LIBNAME) }; @@ -81,9 +99,15 @@ static const map_onesymbol2_t MAPNAME(symbol2map)[] = { #undef DATA #undef DATAV #undef DATAB +#ifdef STATICBUILD +#define DATA(N, S) {#N, S, 0, (void*)&N}, +#define DATAV(N, S) {#N, S, 1, (void*)&N}, +#define DATAB(N, S) {#N, S, 0, (void*)&N}, +#else #define DATA(N, S) {#N, S, 0}, #define DATAV(N, S) {#N, S, 1}, #define DATAB(N, S) {#N, S, 0}, +#endif static const map_onedata_t MAPNAME(datamap)[] = { #include PRIVATE(LIBNAME) }; @@ -94,7 +118,11 @@ static const map_onedata_t MAPNAME(datamap)[] = { #define DATAV(N, S) #define DATAB(N, S) #undef DATAM +#ifdef STATICBUILD +#define DATAM(N, S) {#N, S, 0, &my_##N}, +#else #define DATAM(N, S) {#N, S, 0}, +#endif static const map_onedata_t MAPNAME(mydatamap)[] = { #include PRIVATE(LIBNAME) }; @@ -136,6 +164,7 @@ int FUNC(_init)(library_t* lib, box64context_t* box64) PRE_INIT #endif { +#ifndef STATICBUILD lib->w.lib = dlopen(MAPNAME(Name), RTLD_LAZY | RTLD_GLOBAL); if(!lib->w.lib) { #ifdef ALTNAME @@ -154,6 +183,9 @@ int FUNC(_init)(library_t* lib, box64context_t* box64) } else lib->path = box_strdup(ALTNAME); #endif } else lib->path = box_strdup(MAPNAME(Name)); +#else + lib->path = box_strdup(MAPNAME(Name)); +#endif } WrappedLib_CommonInit(lib); @@ -162,6 +194,25 @@ int FUNC(_init)(library_t* lib, box64context_t* box64) int cnt; // populates maps... +#ifdef STATICBUILD +#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.w##mapname, MAPNAME(mapname)[i].name, &ret); \ + kh_value(lib->w.w##mapname, k).w = MAPNAME(mapname)[i].w; \ + kh_value(lib->w.w##mapname, k).resolved = 0; \ + kh_value(lib->w.w##mapname, k).addr = (uintptr_t)MAPNAME(mapname)[i].addr; \ + } else { \ + k = kh_put(symbolmap, lib->w.mapname, MAPNAME(mapname)[i].name, &ret); \ + kh_value(lib->w.mapname, k).w = MAPNAME(mapname)[i].w; \ + kh_value(lib->w.mapname, k).resolved = 0; \ + kh_value(lib->w.mapname, k).addr = (uintptr_t)MAPNAME(mapname)[i].addr; \ + } \ + if (strchr(MAPNAME(mapname)[i].name, '@')) \ + AddDictionnary(box64->versym, MAPNAME(mapname)[i].name); \ + } +#else #define DOIT(mapname) \ cnt = sizeof(MAPNAME(mapname))/sizeof(map_onesymbol_t); \ for (int i = 0; i < cnt; ++i) { \ @@ -177,6 +228,7 @@ int FUNC(_init)(library_t* lib, box64context_t* box64) if (strchr(MAPNAME(mapname)[i].name, '@')) \ AddDictionnary(box64->versym, MAPNAME(mapname)[i].name); \ } +#endif DOIT(symbolmap) DOIT(mysymbolmap) #undef DOIT @@ -184,7 +236,12 @@ int FUNC(_init)(library_t* lib, box64context_t* box64) for (int i=0; i<cnt; ++i) { k = kh_put(symbolmap, lib->w.stsymbolmap, MAPNAME(stsymbolmap)[i].name, &ret); kh_value(lib->w.stsymbolmap, k).w = MAPNAME(stsymbolmap)[i].w; + #ifdef STATICBUILD + kh_value(lib->w.stsymbolmap, k).resolved = 1; + kh_value(lib->w.stsymbolmap, k).addr = (uintptr_t)MAPNAME(stsymbolmap)[i].addr; + #else kh_value(lib->w.stsymbolmap, k).resolved = 0; + #endif if(strchr(MAPNAME(stsymbolmap)[i].name, '@')) AddDictionnary(box64->versym, MAPNAME(stsymbolmap)[i].name); } @@ -194,7 +251,12 @@ int FUNC(_init)(library_t* lib, box64context_t* box64) 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; + #ifdef STATICBUILD + kh_value(lib->w.symbol2map, k).resolved = 1; + kh_value(lib->w.symbol2map, k).addr = (uintptr_t)MAPNAME(symbol2map)[i].addr; + #else kh_value(lib->w.symbol2map, k).resolved = 0; + #endif if(strchr(MAPNAME(symbol2map)[i].name, '@')) AddDictionnary(box64->versym, MAPNAME(symbol2map)[i].name); } @@ -202,16 +264,31 @@ int FUNC(_init)(library_t* lib, box64context_t* box64) for (int i=0; i<cnt; ++i) { if(MAPNAME(datamap)[i].weak) { k = kh_put(datamap, lib->w.wdatamap, MAPNAME(datamap)[i].name, &ret); + #ifdef STATICBUILD + kh_value(lib->w.wdatamap, k).size = MAPNAME(datamap)[i].sz; + kh_value(lib->w.wdatamap, k).addr = (uintptr_t)MAPNAME(datamap)[i].addr; + #else kh_value(lib->w.wdatamap, k) = MAPNAME(datamap)[i].sz; + #endif } else { k = kh_put(datamap, lib->w.datamap, MAPNAME(datamap)[i].name, &ret); + #ifdef STATICBUILD + kh_value(lib->w.datamap, k).size = MAPNAME(datamap)[i].sz; + kh_value(lib->w.datamap, k).addr = (uintptr_t)MAPNAME(datamap)[i].addr; + #else kh_value(lib->w.datamap, k) = MAPNAME(datamap)[i].sz; + #endif } } cnt = sizeof(MAPNAME(mydatamap))/sizeof(map_onedata_t); for (int i=0; i<cnt; ++i) { k = kh_put(datamap, lib->w.mydatamap, MAPNAME(mydatamap)[i].name, &ret); + #ifdef STATICBUILD + kh_value(lib->w.mydatamap, k).size = MAPNAME(mydatamap)[i].sz; + kh_value(lib->w.mydatamap, k).addr = (uintptr_t)MAPNAME(mydatamap)[i].addr; + #else kh_value(lib->w.mydatamap, k) = MAPNAME(mydatamap)[i].sz; + #endif } #ifdef ALTMY SETALT(ALTMY); |