about summary refs log tree commit diff stats
path: root/src/librarian
diff options
context:
space:
mode:
Diffstat (limited to 'src/librarian')
-rw-r--r--src/librarian/librarian.c6
-rw-r--r--src/librarian/library.c60
-rw-r--r--src/librarian/library_private.h20
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