about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorrajdakin <rajdakin@gmail.com>2021-07-31 13:36:45 +0200
committerrajdakin <rajdakin@gmail.com>2021-07-31 13:36:45 +0200
commitc8640caba352bed19d7289cf9761c0d14d3d2b19 (patch)
tree78534838b40923b18f5207ad3c418c56c9479321 /src
parentf4ea86378ee9a9f3ee418069dc8d12a13813cb28 (diff)
downloadbox64-c8640caba352bed19d7289cf9761c0d14d3d2b19.tar.gz
box64-c8640caba352bed19d7289cf9761c0d14d3d2b19.zip
Started adding GOWM macro
Diffstat (limited to 'src')
-rwxr-xr-xsrc/librarian/library.c74
-rwxr-xr-xsrc/librarian/library_private.h1
-rwxr-xr-xsrc/wrapped/wrappedlib_init.h128
-rwxr-xr-xsrc/wrapped/wrappedlib_undefs.h23
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