about summary refs log tree commit diff stats
path: root/src/librarian
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/librarian
parentf4ea86378ee9a9f3ee418069dc8d12a13813cb28 (diff)
downloadbox64-c8640caba352bed19d7289cf9761c0d14d3d2b19.tar.gz
box64-c8640caba352bed19d7289cf9761c0d14d3d2b19.zip
Started adding GOWM macro
Diffstat (limited to 'src/librarian')
-rwxr-xr-xsrc/librarian/library.c74
-rwxr-xr-xsrc/librarian/library_private.h1
2 files changed, 74 insertions, 1 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;