about summary refs log tree commit diff stats
path: root/src/wrapped/wrappedlib_init.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/wrapped/wrappedlib_init.h')
-rw-r--r--src/wrapped/wrappedlib_init.h91
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);