about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/box64context.c5
-rwxr-xr-xsrc/elfs/elfloader.c2
-rwxr-xr-xsrc/emu/x64emu.c4
-rwxr-xr-xsrc/emu/x64int3.c12
-rwxr-xr-xsrc/emu/x64run_private.c8
-rwxr-xr-xsrc/include/bridge.h11
-rwxr-xr-xsrc/librarian/library.c10
-rwxr-xr-xsrc/libtools/sdl1rwops.c2
-rwxr-xr-xsrc/libtools/sdl2rwops.c2
-rwxr-xr-xsrc/tools/bridge.c61
-rw-r--r--src/wrapped/generated/functions_list.txt2
-rw-r--r--src/wrapped/generated/wrapper.c3
-rw-r--r--src/wrapped/generated/wrapper.h2
-rwxr-xr-xsrc/wrapped/wrappedlibasound.c2
-rwxr-xr-xsrc/wrapped/wrappedlibc.c8
-rwxr-xr-xsrc/wrapped/wrappedlibc_private.h2
-rwxr-xr-xsrc/wrapped/wrappedlibgl.c3
-rwxr-xr-xsrc/wrapped/wrappedlibx11.c14
-rwxr-xr-xsrc/wrapped/wrappedlibxext.c2
-rwxr-xr-xsrc/wrapped/wrappedopenal.c6
-rwxr-xr-xsrc/wrapped/wrappedsdl1.c9
-rwxr-xr-xsrc/wrapped/wrappedsdl2.c7
22 files changed, 127 insertions, 50 deletions
diff --git a/src/box64context.c b/src/box64context.c
index ed33a2fa..91aa4fbc 100755
--- a/src/box64context.c
+++ b/src/box64context.c
@@ -27,6 +27,7 @@ void initAllHelpers(box64context_t* context)
         return;
     my_context = context;
     init_pthread_helper();
+    init_bridge_helper();
     init_signal_helper(context);
     inited = 1;
 }
@@ -39,7 +40,7 @@ void finiAllHelpers(box64context_t* context)
         return;
     fini_pthread_helper(context);
     fini_signal_helper();
-    cleanAlternate();
+    fini_bridge_helper();
     fini_custommem_helper(context);
     finied = 1;
 }
@@ -88,7 +89,7 @@ box64context_t *NewBox64Context(int argc)
     context->local_maplib = NewLibrarian(context, 1);
     context->system = NewBridge();
     // create vsyscall
-    context->vsyscall = AddBridge(context->system, vFv, x64Syscall, 0);
+    context->vsyscall = AddBridge(context->system, vFv, x64Syscall, 0, NULL);
     context->box64lib = dlopen(NULL, RTLD_NOW|RTLD_GLOBAL);
     context->dlprivate = NewDLPrivate();
 
diff --git a/src/elfs/elfloader.c b/src/elfs/elfloader.c
index 2c346db3..a9335de3 100755
--- a/src/elfs/elfloader.c
+++ b/src/elfs/elfloader.c
@@ -726,7 +726,7 @@ int RelocateElfPlt(lib_t *maplib, lib_t *local_maplib, elfheader_t* head)
                 return -1;
         }
         if(pltResolver==~0) {
-            pltResolver = AddBridge(my_context->system, vFE, PltResolver, 0);
+            pltResolver = AddBridge(my_context->system, vFE, PltResolver, 0, "PltResolver");
         }
         if(head->pltgot) {
             *(uintptr_t*)(head->pltgot+head->delta+16) = pltResolver;
diff --git a/src/emu/x64emu.c b/src/emu/x64emu.c
index 1cf93f8f..90008e0d 100755
--- a/src/emu/x64emu.c
+++ b/src/emu/x64emu.c
@@ -45,13 +45,13 @@ uint32_t* GetParityTab()
 
 void PushExit(x64emu_t* emu)
 {
-    uintptr_t endMarker = AddCheckBridge(my_context->system, NULL, NULL, 0);
+    uintptr_t endMarker = AddCheckBridge(my_context->system, NULL, NULL, 0, "ExitEmulation");
     Push(emu, endMarker);
 }
 
 void* GetExit()
 {
-    return (void*)AddCheckBridge(my_context->system, NULL, NULL, 0);
+    return (void*)AddCheckBridge(my_context->system, NULL, NULL, 0, "ExitEmulation");
 }
 
 static void internalX64Setup(x64emu_t* emu, box64context_t *context, uintptr_t start, uintptr_t stack, int stacksize, int ownstack)
diff --git a/src/emu/x64int3.c b/src/emu/x64int3.c
index 8904fa3e..d2ab7336 100755
--- a/src/emu/x64int3.c
+++ b/src/emu/x64int3.c
@@ -93,18 +93,16 @@ void x64Int3(x64emu_t* emu)
                 int perr = 0;
                 uint32_t *pu32 = NULL;
                 const char *s = NULL;
-                {
-                    Dl_info info;
-                    if(dladdr((void*)addr, &info))
-                        s = info.dli_sname;
-                }
-                if(!s) s = GetNativeName((void*)addr);
+                s = GetNativeName((void*)addr);
                 if(addr==(uintptr_t)PltResolver) {
                     snprintf(buff, 256, "%s", " ... ");
-                } else  if(strstr(s, "__open")==s || strcmp(s, "open")==0) {
+                } else  if(strstr(s, "__open")==s || strcmp(s, "open ")==0) {
                     tmp = (char*)(R_RDI);
                     snprintf(buff, 255, "%04d|%p: Calling %s(\"%s\", %d (,%d))", tid, *(void**)(R_RSP), s, (tmp)?tmp:"(nil)", (int)(R_ESI), (int)(R_EDX));
                     perr = 1;
+                } else  if(strstr(s, "my___printf_chk")) {
+                    tmp = (char*)(R_RSI);
+                    snprintf(buff, 255, "%04d|%p: Calling %s(%d, \"%s\" (,%p))", tid, *(void**)(R_RSP), s, R_EDI, (tmp)?tmp:"(nil)", (void*)(R_RDX));
                 } else {
                     snprintf(buff, 255, "%04d|%p: Calling %s (0x%lX, 0x%lX, 0x%lX, ...)", tid, *(void**)(R_RSP), s, R_RDI, R_RSI, R_RDX);
                 }
diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c
index 737225e3..9e012d1f 100755
--- a/src/emu/x64run_private.c
+++ b/src/emu/x64run_private.c
@@ -23,6 +23,7 @@
 #include "x64trace.h"
 #endif
 #include "x64tls.h"
+#include "bridge.h"
 
 #define PARITY(x)   (((emu->x64emu_parity_tab[(x) / 32] >> ((x) % 32)) & 1) == 0)
 #define XOR2(x) 	(((x) ^ ((x)>>1)) & 0x1)
@@ -57,6 +58,13 @@ int32_t EXPORT my___libc_start_main(x64emu_t* emu, int *(main) (int, char * *, c
 const char* GetNativeName(void* p)
 {
     static char buff[500] = {0};
+    #ifdef HAVE_TRACE
+    {
+        const char* n = getBridgeName(p);
+        if(n)
+            return n;
+    }
+    #endif
     Dl_info info;
     if(dladdr(p, &info)==0) {
         const char *ret = GetNameOffset(my_context->maplib, p);
diff --git a/src/include/bridge.h b/src/include/bridge.h
index dfe402f9..9499b440 100755
--- a/src/include/bridge.h
+++ b/src/include/bridge.h
@@ -10,9 +10,9 @@ typedef void (*wrapper_t)(x64emu_t* emu, uintptr_t fnc);
 bridge_t *NewBridge();
 void FreeBridge(bridge_t** bridge);
 
-uintptr_t AddBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N);
+uintptr_t AddBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N, const char* name);
 uintptr_t CheckBridged(bridge_t* bridge, void* fnc);
-uintptr_t AddCheckBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N);
+uintptr_t AddCheckBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N, const char* name);
 uintptr_t AddAutomaticBridge(x64emu_t* emu, bridge_t* bridge, wrapper_t w, void* fnc, int N);
 void* GetNativeFnc(uintptr_t fnc);
 void* GetNativeFncOrFnc(uintptr_t fnc);
@@ -22,4 +22,11 @@ void* getAlternate(void* addr);
 void addAlternate(void* addr, void* alt);
 void cleanAlternate();
 
+#ifdef HAVE_TRACE
+const char* getBridgeName(void* addr);
+#endif
+
+void init_bridge_helper();
+void fini_bridge_helper();
+
 #endif //__BRIDGE_H_
\ No newline at end of file
diff --git a/src/librarian/library.c b/src/librarian/library.c
index bcd8248a..b0be60b4 100755
--- a/src/librarian/library.c
+++ b/src/librarian/library.c
@@ -587,7 +587,7 @@ int getSymbolInMaps(library_t*lib, const char* name, int noweak, uintptr_t *addr
             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->mysymbolmap, k), symbol, 0);
+        *addr = AddBridge(lib->priv.w.bridge, kh_value(lib->mysymbolmap, k), symbol, 0, name);
         *size = sizeof(void*);
         return 1;
     }
@@ -605,7 +605,7 @@ int getSymbolInMaps(library_t*lib, const char* name, int noweak, uintptr_t *addr
             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->stsymbolmap, k), symbol, 4);    // all of this for this little "4"
+        *addr = AddBridge(lib->priv.w.bridge, kh_value(lib->stsymbolmap, k), symbol, sizeof(void*), name);
         *size = sizeof(void*);
         return 1;
     }
@@ -624,7 +624,7 @@ int getSymbolInMaps(library_t*lib, const char* name, int noweak, uintptr_t *addr
             return 0;
         } else 
             AddOffsetSymbol(lib->context->maplib, symbol, name);
-        *addr = AddBridge(lib->priv.w.bridge, kh_value(lib->symbolmap, k), symbol, 0);
+        *addr = AddBridge(lib->priv.w.bridge, kh_value(lib->symbolmap, k), symbol, 0, name);
         *size = sizeof(void*);
         return 1;
     }
@@ -643,7 +643,7 @@ int getSymbolInMaps(library_t*lib, const char* name, int noweak, uintptr_t *addr
                 return 0;
             } else 
                 AddOffsetSymbol(lib->context->maplib, symbol, name);
-            *addr = AddBridge(lib->priv.w.bridge, kh_value(lib->wsymbolmap, k), symbol, 0);
+            *addr = AddBridge(lib->priv.w.bridge, kh_value(lib->wsymbolmap, k), symbol, 0, name);
             *size = sizeof(void*);
             return 1;
         }
@@ -661,7 +661,7 @@ int getSymbolInMaps(library_t*lib, const char* name, int noweak, uintptr_t *addr
                 return 0;
             } else 
                 AddOffsetSymbol(lib->context->maplib, symbol, name);
-            *addr = AddBridge(lib->priv.w.bridge, kh_value(lib->symbol2map, k).w, symbol, 0);
+            *addr = AddBridge(lib->priv.w.bridge, kh_value(lib->symbol2map, k).w, symbol, 0, name);
             *size = sizeof(void*);
             return 1;
         }
diff --git a/src/libtools/sdl1rwops.c b/src/libtools/sdl1rwops.c
index bdb26c83..d4139e7d 100755
--- a/src/libtools/sdl1rwops.c
+++ b/src/libtools/sdl1rwops.c
@@ -106,7 +106,7 @@ SDL1_RWops_t* AddNativeRW(x64emu_t* emu, SDL1_RWops_t* ops)
 
     // get or create wrapper, add it to map and change to the emulated one if rw
     #define GO(A, W) \
-    fnc = AddCheckBridge(system, W, my_native_##A, 0); \
+    fnc = AddCheckBridge(system, W, my_native_##A, 0, NULL); \
     newrw->A = (sdl1_##A)fnc;
 
     GO(seek, iFpii)
diff --git a/src/libtools/sdl2rwops.c b/src/libtools/sdl2rwops.c
index 3874ce60..cc7c5dbc 100755
--- a/src/libtools/sdl2rwops.c
+++ b/src/libtools/sdl2rwops.c
@@ -113,7 +113,7 @@ SDL2_RWops_t* AddNativeRW2(x64emu_t* emu, SDL2_RWops_t* ops)
 
     // get or create wrapper, add it to map and change to the emulated one if rw
     #define GO(A, W) \
-    fnc = AddCheckBridge(system, W, my2_native_##A, 0); \
+    fnc = AddCheckBridge(system, W, my2_native_##A, 0, NULL); \
     newrw->A = (sdl2_##A)fnc;
 
     GO(size, IFp)
diff --git a/src/tools/bridge.c b/src/tools/bridge.c
index 76eb20b2..3724e0b3 100755
--- a/src/tools/bridge.c
+++ b/src/tools/bridge.c
@@ -70,7 +70,11 @@ void FreeBridge(bridge_t** bridge)
     *bridge = NULL;
 }
 
-uintptr_t AddBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N)
+#ifdef HAVE_TRACE
+void addBridgeName(void* addr, const char* name);
+#endif
+
+uintptr_t AddBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N, const char* name)
 {
     pthread_mutex_lock(&bridge->mutex);
     brick_t *b = bridge->last;
@@ -103,6 +107,10 @@ uintptr_t AddBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N)
     khint_t k = kh_put(bridgemap, bridge->bridgemap, (uintptr_t)fnc, &ret);
     kh_value(bridge->bridgemap, k) = (uintptr_t)&b->b[b->sz].CC;
     pthread_mutex_unlock(&bridge->mutex);
+    #ifdef HAVE_TRACE
+    if(name)
+        addBridgeName(fnc, name);
+    #endif
 
     return (uintptr_t)&b->b[b->sz++].CC;
 }
@@ -116,13 +124,13 @@ uintptr_t CheckBridged(bridge_t* bridge, void* fnc)
     return kh_value(bridge->bridgemap, k);
 }
 
-uintptr_t AddCheckBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N)
+uintptr_t AddCheckBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N, const char* name)
 {
     if(!fnc && w)
         return 0;
     uintptr_t ret = CheckBridged(bridge, fnc);
     if(!ret)
-        ret = AddBridge(bridge, w, fnc, N);
+        ret = AddBridge(bridge, w, fnc, N, name);
     return ret;
 }
 
@@ -132,7 +140,7 @@ uintptr_t AddAutomaticBridge(x64emu_t* emu, bridge_t* bridge, wrapper_t w, void*
         return 0;
     uintptr_t ret = CheckBridged(bridge, fnc);
     if(!ret)
-        ret = AddBridge(bridge, w, fnc, N);
+        ret = AddBridge(bridge, w, fnc, N, NULL);
     if(!hasAlternate(fnc)) {
         printf_log(LOG_DEBUG, "Adding AutomaticBridge for %p to %p\n", fnc, (void*)ret);
         addAlternate(fnc, (void*)ret);
@@ -180,6 +188,36 @@ void* GetNativeFncOrFnc(uintptr_t fnc)
     return (void*)b->f;
 }
 
+#ifdef HAVE_TRACE
+KHASH_MAP_INIT_INT64(bridgename, const char*)
+static kh_bridgename_t *bridgename;
+void initBridgeName()
+{
+    bridgename = kh_init(bridgename);
+}
+void finiBridgeName()
+{
+    kh_destroy(bridgename, bridgename);
+    bridgename = NULL;
+}
+void addBridgeName(void* addr, const char* name)
+{
+    int ret;
+    khint_t k = kh_put(bridgename, bridgename, (uintptr_t)addr, &ret);
+    if(!ret) // already there
+        return;
+    kh_value(bridgename, k) = name;
+}
+const char* getBridgeName(void* addr)
+{
+    khint_t k = kh_get(bridgename, bridgename, (uintptr_t)addr);
+    if(k!=kh_end(bridgename))
+        return kh_value(bridgename, k);
+    return NULL;
+}
+#endif
+
+
 // Alternate address handling
 KHASH_MAP_INIT_INT64(alternate, void*)
 static kh_alternate_t *my_alternates = NULL;
@@ -218,3 +256,18 @@ void cleanAlternate() {
         my_alternates = NULL;
     }
 }
+
+void init_bridge_helper()
+{
+    #ifdef HAVE_TRACE
+    initBridgeName();
+    #endif
+}
+
+void fini_bridge_helper()
+{
+    cleanAlternate();
+    #ifdef HAVE_TRACE
+    finiBridgeName();
+    #endif
+}
diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt
index 7c79e560..3b61e9b0 100644
--- a/src/wrapped/generated/functions_list.txt
+++ b/src/wrapped/generated/functions_list.txt
@@ -514,6 +514,7 @@
 #() iFEippp
 #() iFEpipi
 #() iFEpipp
+#() iFEpipV
 #() iFEpLpp
 #() iFEppiV
 #() iFEpppp
@@ -894,6 +895,5 @@
 #() pFppv -> pFpp
 #() iFEvpp -> iFEpp
 #() iFEpvpp -> iFEppp
-#() iFEpvpV -> iFEppV
 #() iFEpLvvpp -> iFEpLpp
 #() iFEpuvvppp -> iFEpuppp
diff --git a/src/wrapped/generated/wrapper.c b/src/wrapped/generated/wrapper.c
index 1d103fb8..05da770b 100644
--- a/src/wrapped/generated/wrapper.c
+++ b/src/wrapped/generated/wrapper.c
@@ -547,6 +547,7 @@ typedef void (*vFppppp_t)(void*, void*, void*, void*, void*);
 typedef int32_t (*iFEippp_t)(x64emu_t*, int32_t, void*, void*, void*);
 typedef int32_t (*iFEpipi_t)(x64emu_t*, void*, int32_t, void*, int32_t);
 typedef int32_t (*iFEpipp_t)(x64emu_t*, void*, int32_t, void*, void*);
+typedef int32_t (*iFEpipV_t)(x64emu_t*, void*, int32_t, void*, void*);
 typedef int32_t (*iFEpLpp_t)(x64emu_t*, void*, uintptr_t, void*, void*);
 typedef int32_t (*iFEppiV_t)(x64emu_t*, void*, void*, int32_t, void*);
 typedef int32_t (*iFEpppp_t)(x64emu_t*, void*, void*, void*, void*);
@@ -1444,6 +1445,7 @@ void vFppppp(x64emu_t *emu, uintptr_t fcn) { vFppppp_t fn = (vFppppp_t)fcn; fn((
 void iFEippp(x64emu_t *emu, uintptr_t fcn) { iFEippp_t fn = (iFEippp_t)fcn; R_RAX=fn(emu, (int32_t)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX); }
 void iFEpipi(x64emu_t *emu, uintptr_t fcn) { iFEpipi_t fn = (iFEpipi_t)fcn; R_RAX=fn(emu, (void*)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (int32_t)R_RCX); }
 void iFEpipp(x64emu_t *emu, uintptr_t fcn) { iFEpipp_t fn = (iFEpipp_t)fcn; R_RAX=fn(emu, (void*)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (void*)R_RCX); }
+void iFEpipV(x64emu_t *emu, uintptr_t fcn) { iFEpipV_t fn = (iFEpipV_t)fcn; R_RAX=fn(emu, (void*)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (void*)(R_RSP + 8)); }
 void iFEpLpp(x64emu_t *emu, uintptr_t fcn) { iFEpLpp_t fn = (iFEpLpp_t)fcn; R_RAX=fn(emu, (void*)R_RDI, (uintptr_t)R_RSI, (void*)R_RDX, (void*)R_RCX); }
 void iFEppiV(x64emu_t *emu, uintptr_t fcn) { iFEppiV_t fn = (iFEppiV_t)fcn; R_RAX=fn(emu, (void*)R_RDI, (void*)R_RSI, (int32_t)R_RDX, (void*)(R_RSP + 8)); }
 void iFEpppp(x64emu_t *emu, uintptr_t fcn) { iFEpppp_t fn = (iFEpppp_t)fcn; R_RAX=fn(emu, (void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX); }
@@ -1831,6 +1833,5 @@ void pFEv(x64emu_t *emu, uintptr_t fcn) { pFE_t fn = (pFE_t)fcn; R_RAX=(uintptr_
 void pFppv(x64emu_t *emu, uintptr_t fcn) { pFpp_t fn = (pFpp_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (void*)R_RSI); }
 void iFEvpp(x64emu_t *emu, uintptr_t fcn) { iFEpp_t fn = (iFEpp_t)fcn; R_RAX=fn(emu, (void*)R_RSI, (void*)R_RDX); }
 void iFEpvpp(x64emu_t *emu, uintptr_t fcn) { iFEppp_t fn = (iFEppp_t)fcn; R_RAX=fn(emu, (void*)R_RDI, (void*)R_RDX, (void*)R_RCX); }
-void iFEpvpV(x64emu_t *emu, uintptr_t fcn) { iFEppV_t fn = (iFEppV_t)fcn; R_RAX=fn(emu, (void*)R_RDI, (void*)R_RDX, (void*)(R_RSP + 8)); }
 void iFEpLvvpp(x64emu_t *emu, uintptr_t fcn) { iFEpLpp_t fn = (iFEpLpp_t)fcn; R_RAX=fn(emu, (void*)R_RDI, (uintptr_t)R_RSI, (void*)R_R8, (void*)R_R9); }
 void iFEpuvvppp(x64emu_t *emu, uintptr_t fcn) { iFEpuppp_t fn = (iFEpuppp_t)fcn; R_RAX=fn(emu, (void*)R_RDI, (uint32_t)R_RSI, (void*)R_R8, (void*)R_R9, *(void**)(R_RSP + 8)); }
diff --git a/src/wrapped/generated/wrapper.h b/src/wrapped/generated/wrapper.h
index 1e9c7411..0573918b 100644
--- a/src/wrapped/generated/wrapper.h
+++ b/src/wrapped/generated/wrapper.h
@@ -544,6 +544,7 @@ void vFppppp(x64emu_t *emu, uintptr_t fnc);
 void iFEippp(x64emu_t *emu, uintptr_t fnc);
 void iFEpipi(x64emu_t *emu, uintptr_t fnc);
 void iFEpipp(x64emu_t *emu, uintptr_t fnc);
+void iFEpipV(x64emu_t *emu, uintptr_t fnc);
 void iFEpLpp(x64emu_t *emu, uintptr_t fnc);
 void iFEppiV(x64emu_t *emu, uintptr_t fnc);
 void iFEpppp(x64emu_t *emu, uintptr_t fnc);
@@ -931,7 +932,6 @@ void pFEv(x64emu_t *emu, uintptr_t fnc);
 void pFppv(x64emu_t *emu, uintptr_t fnc);
 void iFEvpp(x64emu_t *emu, uintptr_t fnc);
 void iFEpvpp(x64emu_t *emu, uintptr_t fnc);
-void iFEpvpV(x64emu_t *emu, uintptr_t fnc);
 void iFEpLvvpp(x64emu_t *emu, uintptr_t fnc);
 void iFEpuvvppp(x64emu_t *emu, uintptr_t fnc);
 
diff --git a/src/wrapped/wrappedlibasound.c b/src/wrapped/wrappedlibasound.c
index a11b0fde..acb5f3de 100755
--- a/src/wrapped/wrappedlibasound.c
+++ b/src/wrapped/wrappedlibasound.c
@@ -52,7 +52,7 @@ void* getAsoundMy(library_t* lib)
     SUPER()
     #undef GO
     // setup custom error handler
-    my_snd_lib_error = AddCheckBridge(my_context->system, vFpipipV, default_error_handler, 0);
+    my_snd_lib_error = AddCheckBridge(my_context->system, vFpipipV, default_error_handler, 0, "ASoundCustomErrorHandler");
     //all done
     return my;
 }
diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c
index bba0a0ad..19e41805 100755
--- a/src/wrapped/wrappedlibc.c
+++ b/src/wrapped/wrappedlibc.c
@@ -604,11 +604,15 @@ EXPORT int my___vfprintf_chk(x64emu_t *emu, void* F, void* fmt, x64_va_list_t b)
 EXPORT int my__IO_vfprintf(x64emu_t *emu, void* F, void* fmt, x64_va_list_t b) __attribute__((alias("my_vfprintf")));
 
 EXPORT int my_fprintf(x64emu_t *emu, void* F, void* fmt, void* b)  {
-    myStackAlign(emu, (const char*)fmt, b, emu->scratch, R_EAX, 1);
+    myStackAlign(emu, (const char*)fmt, b, emu->scratch, R_EAX, 2);
+    PREPARE_VALIST;
+    return vfprintf(F, fmt, VARARGS);
+}
+EXPORT int my___fprintf_chk(x64emu_t *emu, void* F, int flag, void* fmt, void* b)  {
+    myStackAlign(emu, (const char*)fmt, b, emu->scratch, R_EAX, 3);
     PREPARE_VALIST;
     return vfprintf(F, fmt, VARARGS);
 }
-EXPORT int my___fprintf_chk(x64emu_t *emu, void* F, void* fmt, void* b) __attribute__((alias("my_fprintf")));
 
 #if 0
 EXPORT int my_wprintf(x64emu_t *emu, void* fmt, void* b, va_list V) {
diff --git a/src/wrapped/wrappedlibc_private.h b/src/wrapped/wrappedlibc_private.h
index 4aebcf85..be3b47e8 100755
--- a/src/wrapped/wrappedlibc_private.h
+++ b/src/wrapped/wrappedlibc_private.h
@@ -376,7 +376,7 @@ GOM(fork, lFEv) // Weak
 //GOW(fpathconf, 
 //GO(__fpending, 
 GOM(fprintf, iFEppV)
-GOM(__fprintf_chk, iFEpvpV)
+GOM(__fprintf_chk, iFEpipV)
 //DATA(__fpu_control, 
 //GO(__fpurge, 
 GO(fputc, iFip)
diff --git a/src/wrapped/wrappedlibgl.c b/src/wrapped/wrappedlibgl.c
index 2343506a..8f544a3c 100755
--- a/src/wrapped/wrappedlibgl.c
+++ b/src/wrapped/wrappedlibgl.c
@@ -75,8 +75,9 @@ EXPORT void* my_glXGetProcAddress(x64emu_t* emu, void* name)
         if(dlsym_error && box64_log<LOG_INFO) printf_log(LOG_NONE, "Warning, no wrapper for %s\n", rname);
         return NULL;
     }
+    const char* constname = kh_key(emu->context->glwrappers, k);
     AddOffsetSymbol(emu->context->maplib, symbol, rname);
-    ret = AddBridge(emu->context->system, kh_value(emu->context->glwrappers, k), symbol, 0);
+    ret = AddBridge(emu->context->system, kh_value(emu->context->glwrappers, k), symbol, 0, constname);
     if(dlsym_error && box64_log<LOG_DEBUG) printf_log(LOG_NONE, "%p\n", (void*)ret);
     return (void*)ret;
 
diff --git a/src/wrapped/wrappedlibx11.c b/src/wrapped/wrappedlibx11.c
index 51d71079..d207f79f 100755
--- a/src/wrapped/wrappedlibx11.c
+++ b/src/wrapped/wrappedlibx11.c
@@ -204,7 +204,7 @@ static void* reverse_wire_to_eventFct(library_t* lib, void* fct)
     #define GO(A) if(my_wire_to_event_##A == fct) return (void*)my_wire_to_event_fct_##A;
     SUPER()
     #undef GO
-    return (void*)AddBridge(lib->priv.w.bridge, iFppp, fct, 0);
+    return (void*)AddBridge(lib->priv.w.bridge, iFppp, fct, 0, NULL);
 }
 
 // event_to_wire
@@ -237,7 +237,7 @@ static void* reverse_event_to_wireFct(library_t* lib, void* fct)
     #define GO(A) if(my_event_to_wire_##A == fct) return (void*)my_event_to_wire_fct_##A;
     SUPER()
     #undef GO
-    return (void*)AddBridge(lib->priv.w.bridge, iFppp, fct, 0);
+    return (void*)AddBridge(lib->priv.w.bridge, iFppp, fct, 0, NULL);
 }
 
 // error_handler
@@ -270,7 +270,7 @@ static void* reverse_error_handlerFct(library_t* lib, void* fct)
     #define GO(A) if(my_error_handler_##A == fct) return (void*)my_error_handler_fct_##A;
     SUPER()
     #undef GO
-    return (void*)AddBridge(lib->priv.w.bridge, iFpp, fct, 0);
+    return (void*)AddBridge(lib->priv.w.bridge, iFpp, fct, 0, NULL);
 }
 
 // ioerror_handler
@@ -303,7 +303,7 @@ static void* reverse_ioerror_handlerFct(library_t* lib, void* fct)
     #define GO(A) if(my_ioerror_handler_##A == fct) return (void*)my_ioerror_handler_fct_##A;
     SUPER()
     #undef GO
-    return (void*)AddBridge(lib->priv.w.bridge, iFp, fct, 0);
+    return (void*)AddBridge(lib->priv.w.bridge, iFp, fct, 0, NULL);
 }
 
 // exterror_handler
@@ -336,7 +336,7 @@ static void* reverse_exterror_handlerFct(library_t* lib, void* fct)
     #define GO(A) if(my_exterror_handler_##A == fct) return (void*)my_exterror_handler_fct_##A;
     SUPER()
     #undef GO
-    return (void*)AddBridge(lib->priv.w.bridge, iFpppp, fct, 0);
+    return (void*)AddBridge(lib->priv.w.bridge, iFpppp, fct, 0, NULL);
 }
 
 // close_display
@@ -369,7 +369,7 @@ static void* reverse_close_displayFct(library_t* lib, void* fct)
     #define GO(A) if(my_close_display_##A == fct) return (void*)my_close_display_fct_##A;
     SUPER()
     #undef GO
-    return (void*)AddBridge(lib->priv.w.bridge, iFpp, fct, 0);
+    return (void*)AddBridge(lib->priv.w.bridge, iFpp, fct, 0, NULL);
 }
 
 // register_im
@@ -402,7 +402,7 @@ static void* reverse_register_imFct(library_t* lib, void* fct)
     #define GO(A) if(my_register_im_##A == fct) return (void*)my_register_im_fct_##A;
     SUPER()
     #undef GO
-    return (void*)AddBridge(lib->priv.w.bridge, iFppp, fct, 0);
+    return (void*)AddBridge(lib->priv.w.bridge, iFppp, fct, 0, NULL);
 }
 
 // XConnectionWatchProc
diff --git a/src/wrapped/wrappedlibxext.c b/src/wrapped/wrappedlibxext.c
index 9482b70f..ab73af17 100755
--- a/src/wrapped/wrappedlibxext.c
+++ b/src/wrapped/wrappedlibxext.c
@@ -111,7 +111,7 @@ static void* reverse_exterrorhandleFct(void* fct)
     #define GO(A) if(my_exterrorhandle_##A == fct) return (void*)my_exterrorhandle_fct_##A;
     SUPER()
     #undef GO
-    return (void*)AddBridge(my_lib->priv.w.bridge, iFppp, fct, 0);
+    return (void*)AddBridge(my_lib->priv.w.bridge, iFppp, fct, 0, NULL);
 }
 
 #undef SUPER
diff --git a/src/wrapped/wrappedopenal.c b/src/wrapped/wrappedopenal.c
index 7f17bd4d..27b1af20 100755
--- a/src/wrapped/wrappedopenal.c
+++ b/src/wrapped/wrappedopenal.c
@@ -171,8 +171,9 @@ EXPORT void* my_alGetProcAddress(x64emu_t* emu, void* name)
         printf_log(LOG_INFO, "Warning, no wrapper for %s\n", rname);
         return NULL;
     }
+    const char* constname = kh_key(emu->context->alwrappers, k);
     AddOffsetSymbol(emu->context->maplib, symbol, rname);
-    return (void*)AddBridge(emu->context->system, kh_value(emu->context->alwrappers, k), symbol, 0);
+    return (void*)AddBridge(emu->context->system, kh_value(emu->context->alwrappers, k), symbol, 0, constname);
 }
 
 EXPORT void* my_alcGetProcAddress(x64emu_t* emu, void* device, void* name)
@@ -206,8 +207,9 @@ EXPORT void* my_alcGetProcAddress(x64emu_t* emu, void* device, void* name)
         printf_log(LOG_INFO, "Warning, no wrapper for %s\n", rname);
         return NULL;
     }
+    const char* constname = kh_key(emu->context->alwrappers, k);
     AddOffsetSymbol(emu->context->maplib, symbol, rname);
-    return (void*)AddBridge(emu->context->system, kh_value(emu->context->alwrappers, k), symbol, 0);
+    return (void*)AddBridge(emu->context->system, kh_value(emu->context->alwrappers, k), symbol, 0, constname);
 }
 
 EXPORT void my_alRequestFoldbackStart(x64emu_t *emu, int32_t mode, int32_t count, int32_t length, void* mem, void* cb)
diff --git a/src/wrapped/wrappedsdl1.c b/src/wrapped/wrappedsdl1.c
index f608b8ec..3f78bc38 100755
--- a/src/wrapped/wrappedsdl1.c
+++ b/src/wrapped/wrappedsdl1.c
@@ -213,7 +213,7 @@ static void* reverse_EvtFilterFct(void* fct)
     #define GO(A) if(my_EvtFilter_##A == fct) return (void*)my_EvtFilter_fct_##A;
     SUPER()
     #undef GO
-    return (void*)AddBridge(my_lib->priv.w.bridge, iFp, fct, 0);
+    return (void*)AddBridge(my_lib->priv.w.bridge, iFp, fct, 0, NULL);
 }
 #undef SUPER
 
@@ -497,7 +497,8 @@ EXPORT void* my_SDL_GL_GetProcAddress(x64emu_t* emu, void* name)
         return NULL;
     }
     AddOffsetSymbol(emu->context->maplib, symbol, rname);
-    return (void*)AddBridge(emu->context->system, kh_value(emu->context->glwrappers, k), symbol, 0);
+    const char* constname = kh_key(emu->context->glwrappers, k);
+    return (void*)AddBridge(emu->context->system, kh_value(emu->context->glwrappers, k), symbol, 0, constname);
 }
 
 // DL functions from wrappedlibdl.c
@@ -546,9 +547,9 @@ EXPORT int32_t my_SDL_GetWMInfo(x64emu_t* emu, void* p)
     int ret = my->SDL_GetWMInfo(p);
     my_SDL_SysWMinfo *info = (my_SDL_SysWMinfo*)p;
     if(info->info.x11.lock_func)
-        info->info.x11.lock_func = (void*)AddBridge(emu->context->system, vFv, info->info.x11.lock_func, 0);
+        info->info.x11.lock_func = (void*)AddBridge(emu->context->system, vFv, info->info.x11.lock_func, 0, NULL);
     if(info->info.x11.unlock_func)
-        info->info.x11.unlock_func = (void*)AddBridge(emu->context->system, vFv, info->info.x11.unlock_func, 0);
+        info->info.x11.unlock_func = (void*)AddBridge(emu->context->system, vFv, info->info.x11.unlock_func, 0, NULL);
     return ret;
 }
 
diff --git a/src/wrapped/wrappedsdl2.c b/src/wrapped/wrappedsdl2.c
index f0489193..97507a19 100755
--- a/src/wrapped/wrappedsdl2.c
+++ b/src/wrapped/wrappedsdl2.c
@@ -264,7 +264,7 @@ static void* reverse_eventfilter_Fct(void* fct)
     #define GO(A) if(my_eventfilter_##A == fct) return (void*)my_eventfilter_fct_##A;
     SUPER()
     #undef GO
-    return (void*)AddBridge(my_context->sdl2lib->priv.w.bridge, iFpp, fct, 0);
+    return (void*)AddBridge(my_context->sdl2lib->priv.w.bridge, iFpp, fct, 0, NULL);
 }
 
 // LogOutput
@@ -297,7 +297,7 @@ static void* reverse_LogOutput_Fct(void* fct)
     #define GO(A) if(my_LogOutput_##A == fct) return (void*)my_LogOutput_fct_##A;
     SUPER()
     #undef GO
-    return (void*)AddBridge(my_context->sdl2lib->priv.w.bridge, vFpiip, fct, 0);
+    return (void*)AddBridge(my_context->sdl2lib->priv.w.bridge, vFpiip, fct, 0, NULL);
 }
 
 #undef SUPER
@@ -773,7 +773,8 @@ EXPORT void* my2_SDL_GL_GetProcAddress(x64emu_t* emu, void* name)
         return NULL;
     }
     AddOffsetSymbol(emu->context->maplib, symbol, rname);
-    return (void*)AddBridge(emu->context->system, kh_value(emu->context->glwrappers, k), symbol, 0);
+    const char* constname = kh_key(emu->context->glwrappers, k);
+    return (void*)AddBridge(emu->context->system, kh_value(emu->context->glwrappers, k), symbol, 0, constname);
 }
 
 #define nb_once	16