about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-13 10:06:12 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-13 10:06:12 +0100
commitca345d7f55135ac698106b8a9a835ddc8ea10d1b (patch)
tree3e1706015409886cbf8cbb767ab37da181eb7742 /src
parent066410a31de7893e1c96a167e1f7d9a9350997f9 (diff)
downloadbox64-ca345d7f55135ac698106b8a9a835ddc8ea10d1b.tar.gz
box64-ca345d7f55135ac698106b8a9a835ddc8ea10d1b.zip
Added SDL2_mixer, SDL2_image, SDL2_ttf2 and SMPEG2 wrapped libs, plus a few more libc wrapped functions
Diffstat (limited to 'src')
-rwxr-xr-xsrc/emu/x64int3.c2
-rwxr-xr-xsrc/library_list.h8
-rw-r--r--src/wrapped/generated/functions_list.txt7
-rw-r--r--src/wrapped/generated/wrapper.c14
-rw-r--r--src/wrapped/generated/wrapper.h7
-rwxr-xr-xsrc/wrapped/wrappedlibc.c1
-rwxr-xr-xsrc/wrapped/wrappedlibc_private.h28
-rwxr-xr-xsrc/wrapped/wrappedsdl2image.c164
-rwxr-xr-xsrc/wrapped/wrappedsdl2image_private.h69
-rwxr-xr-xsrc/wrapped/wrappedsdl2mixer.c284
-rwxr-xr-xsrc/wrapped/wrappedsdl2mixer_private.h86
-rwxr-xr-xsrc/wrapped/wrappedsdl2ttf.c71
-rwxr-xr-xsrc/wrapped/wrappedsdl2ttf_private.h49
-rwxr-xr-xsrc/wrapped/wrappedsmpeg2.c111
-rwxr-xr-xsrc/wrapped/wrappedsmpeg2_private.h29
15 files changed, 907 insertions, 23 deletions
diff --git a/src/emu/x64int3.c b/src/emu/x64int3.c
index d2ab7336..a138ef0e 100755
--- a/src/emu/x64int3.c
+++ b/src/emu/x64int3.c
@@ -96,7 +96,7 @@ void x64Int3(x64emu_t* emu)
                 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") || !strcmp(s, "open ")) {
                     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;
diff --git a/src/library_list.h b/src/library_list.h
index 2238f024..61bf04e7 100755
--- a/src/library_list.h
+++ b/src/library_list.h
@@ -16,15 +16,15 @@ GO("libSDL2-2.0.so.0", sdl2)
 GO("libSDL2-2.0.so.1", sdl2)
 GO("libSDL2.so", sdl2)
 GO("libsdl2-2.0.so.0", sdl2)
-//GO("libSDL2_mixer-2.0.so.0", sdl2mixer)
-//GO("libSDL2_image-2.0.so.0", sdl2image)
-//GO("libSDL2_ttf-2.0.so.0", sdl2ttf)
+GO("libSDL2_mixer-2.0.so.0", sdl2mixer)
+GO("libSDL2_image-2.0.so.0", sdl2image)
+GO("libSDL2_ttf-2.0.so.0", sdl2ttf)
 GO("libSDL-1.2.so.0", sdl1)
 GO("libSDL_mixer-1.2.so.0", sdl1mixer)
 GO("libSDL_image-1.2.so.0", sdl1image)
 GO("libSDL_ttf-2.0.so.0", sdl1ttf)
 GO("libsmpeg-0.4.so.0", smpeg)
-//GO("libsmpeg2-2.0.so.0", smpeg2)
+GO("libsmpeg2-2.0.so.0", smpeg2)
 //GO("libvorbisfile.so.3", vorbisfile)
 //GO("libvorbis.so.0", libvorbis)
 //GO("libogg.so.0", libogg)
diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt
index bbf2f5b8..2379470c 100644
--- a/src/wrapped/generated/functions_list.txt
+++ b/src/wrapped/generated/functions_list.txt
@@ -194,6 +194,7 @@
 #() vFppi
 #() vFppu
 #() vFppp
+#() iFEiw
 #() iFEip
 #() iFEWW
 #() iFEup
@@ -202,6 +203,7 @@
 #() iFEpp
 #() iFEpV
 #() iFESp
+#() iFiwC
 #() iFiii
 #() iFiiu
 #() iFiip
@@ -439,7 +441,7 @@
 #() pFuiii
 #() pFpiii
 #() pFpiip
-#() pFpiuu
+#() pFpiLL
 #() pFpipi
 #() pFpipp
 #() pFpCWp
@@ -577,6 +579,8 @@
 #() pFEpipL
 #() pFEpipp
 #() pFEpupp
+#() pFEppii
+#() pFEppip
 #() pFEpppp
 #() pFuiiiu
 #() pFuiipp
@@ -656,6 +660,7 @@
 #() iFEppppp
 #() iFiiiiii
 #() iFiiiiip
+#() iFiuiipi
 #() iFuppipp
 #() iFuppppp
 #() iFpiiiii
diff --git a/src/wrapped/generated/wrapper.c b/src/wrapped/generated/wrapper.c
index 8b0861eb..224afce3 100644
--- a/src/wrapped/generated/wrapper.c
+++ b/src/wrapped/generated/wrapper.c
@@ -227,6 +227,7 @@ typedef void (*vFpup_t)(void*, uint32_t, void*);
 typedef void (*vFppi_t)(void*, void*, int32_t);
 typedef void (*vFppu_t)(void*, void*, uint32_t);
 typedef void (*vFppp_t)(void*, void*, void*);
+typedef int32_t (*iFEiw_t)(x64emu_t*, int32_t, int16_t);
 typedef int32_t (*iFEip_t)(x64emu_t*, int32_t, void*);
 typedef int32_t (*iFEWW_t)(x64emu_t*, uint16_t, uint16_t);
 typedef int32_t (*iFEup_t)(x64emu_t*, uint32_t, void*);
@@ -235,6 +236,7 @@ typedef int32_t (*iFEpL_t)(x64emu_t*, void*, uintptr_t);
 typedef int32_t (*iFEpp_t)(x64emu_t*, void*, void*);
 typedef int32_t (*iFEpV_t)(x64emu_t*, void*, void*);
 typedef int32_t (*iFESp_t)(x64emu_t*, void*, void*);
+typedef int32_t (*iFiwC_t)(int32_t, int16_t, uint8_t);
 typedef int32_t (*iFiii_t)(int32_t, int32_t, int32_t);
 typedef int32_t (*iFiiu_t)(int32_t, int32_t, uint32_t);
 typedef int32_t (*iFiip_t)(int32_t, int32_t, void*);
@@ -472,7 +474,7 @@ typedef void* (*pFippL_t)(int32_t, void*, void*, uintptr_t);
 typedef void* (*pFuiii_t)(uint32_t, int32_t, int32_t, int32_t);
 typedef void* (*pFpiii_t)(void*, int32_t, int32_t, int32_t);
 typedef void* (*pFpiip_t)(void*, int32_t, int32_t, void*);
-typedef void* (*pFpiuu_t)(void*, int32_t, uint32_t, uint32_t);
+typedef void* (*pFpiLL_t)(void*, int32_t, uintptr_t, uintptr_t);
 typedef void* (*pFpipi_t)(void*, int32_t, void*, int32_t);
 typedef void* (*pFpipp_t)(void*, int32_t, void*, void*);
 typedef void* (*pFpCWp_t)(void*, uint8_t, uint16_t, void*);
@@ -610,6 +612,8 @@ typedef void* (*pFEpiii_t)(x64emu_t*, void*, int32_t, int32_t, int32_t);
 typedef void* (*pFEpipL_t)(x64emu_t*, void*, int32_t, void*, uintptr_t);
 typedef void* (*pFEpipp_t)(x64emu_t*, void*, int32_t, void*, void*);
 typedef void* (*pFEpupp_t)(x64emu_t*, void*, uint32_t, void*, void*);
+typedef void* (*pFEppii_t)(x64emu_t*, void*, void*, int32_t, int32_t);
+typedef void* (*pFEppip_t)(x64emu_t*, void*, void*, int32_t, void*);
 typedef void* (*pFEpppp_t)(x64emu_t*, void*, void*, void*, void*);
 typedef void* (*pFuiiiu_t)(uint32_t, int32_t, int32_t, int32_t, uint32_t);
 typedef void* (*pFuiipp_t)(uint32_t, int32_t, int32_t, void*, void*);
@@ -689,6 +693,7 @@ typedef int32_t (*iFEpuppp_t)(x64emu_t*, void*, uint32_t, void*, void*, void*);
 typedef int32_t (*iFEppppp_t)(x64emu_t*, void*, void*, void*, void*, void*);
 typedef int32_t (*iFiiiiii_t)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t);
 typedef int32_t (*iFiiiiip_t)(int32_t, int32_t, int32_t, int32_t, int32_t, void*);
+typedef int32_t (*iFiuiipi_t)(int32_t, uint32_t, int32_t, int32_t, void*, int32_t);
 typedef int32_t (*iFuppipp_t)(uint32_t, void*, void*, int32_t, void*, void*);
 typedef int32_t (*iFuppppp_t)(uint32_t, void*, void*, void*, void*, void*);
 typedef int32_t (*iFpiiiii_t)(void*, int32_t, int32_t, int32_t, int32_t, int32_t);
@@ -1155,6 +1160,7 @@ void vFpup(x64emu_t *emu, uintptr_t fcn) { vFpup_t fn = (vFpup_t)fcn; fn((void*)
 void vFppi(x64emu_t *emu, uintptr_t fcn) { vFppi_t fn = (vFppi_t)fcn; fn((void*)R_RDI, (void*)R_RSI, (int32_t)R_RDX); }
 void vFppu(x64emu_t *emu, uintptr_t fcn) { vFppu_t fn = (vFppu_t)fcn; fn((void*)R_RDI, (void*)R_RSI, (uint32_t)R_RDX); }
 void vFppp(x64emu_t *emu, uintptr_t fcn) { vFppp_t fn = (vFppp_t)fcn; fn((void*)R_RDI, (void*)R_RSI, (void*)R_RDX); }
+void iFEiw(x64emu_t *emu, uintptr_t fcn) { iFEiw_t fn = (iFEiw_t)fcn; R_RAX=fn(emu, (int32_t)R_RDI, (int16_t)R_RSI); }
 void iFEip(x64emu_t *emu, uintptr_t fcn) { iFEip_t fn = (iFEip_t)fcn; R_RAX=fn(emu, (int32_t)R_RDI, (void*)R_RSI); }
 void iFEWW(x64emu_t *emu, uintptr_t fcn) { iFEWW_t fn = (iFEWW_t)fcn; R_RAX=fn(emu, (uint16_t)R_RDI, (uint16_t)R_RSI); }
 void iFEup(x64emu_t *emu, uintptr_t fcn) { iFEup_t fn = (iFEup_t)fcn; R_RAX=fn(emu, (uint32_t)R_RDI, (void*)R_RSI); }
@@ -1163,6 +1169,7 @@ void iFEpL(x64emu_t *emu, uintptr_t fcn) { iFEpL_t fn = (iFEpL_t)fcn; R_RAX=fn(e
 void iFEpp(x64emu_t *emu, uintptr_t fcn) { iFEpp_t fn = (iFEpp_t)fcn; R_RAX=fn(emu, (void*)R_RDI, (void*)R_RSI); }
 void iFEpV(x64emu_t *emu, uintptr_t fcn) { iFEpV_t fn = (iFEpV_t)fcn; R_RAX=fn(emu, (void*)R_RDI, (void*)(R_RSP + 8)); }
 void iFESp(x64emu_t *emu, uintptr_t fcn) { iFESp_t fn = (iFESp_t)fcn; R_RAX=fn(emu, io_convert((void*)R_RDI), (void*)R_RSI); }
+void iFiwC(x64emu_t *emu, uintptr_t fcn) { iFiwC_t fn = (iFiwC_t)fcn; R_RAX=fn((int32_t)R_RDI, (int16_t)R_RSI, (uint8_t)R_RDX); }
 void iFiii(x64emu_t *emu, uintptr_t fcn) { iFiii_t fn = (iFiii_t)fcn; R_RAX=fn((int32_t)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX); }
 void iFiiu(x64emu_t *emu, uintptr_t fcn) { iFiiu_t fn = (iFiiu_t)fcn; R_RAX=fn((int32_t)R_RDI, (int32_t)R_RSI, (uint32_t)R_RDX); }
 void iFiip(x64emu_t *emu, uintptr_t fcn) { iFiip_t fn = (iFiip_t)fcn; R_RAX=fn((int32_t)R_RDI, (int32_t)R_RSI, (void*)R_RDX); }
@@ -1400,7 +1407,7 @@ void pFippL(x64emu_t *emu, uintptr_t fcn) { pFippL_t fn = (pFippL_t)fcn; R_RAX=(
 void pFuiii(x64emu_t *emu, uintptr_t fcn) { pFuiii_t fn = (pFuiii_t)fcn; R_RAX=(uintptr_t)fn((uint32_t)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX); }
 void pFpiii(x64emu_t *emu, uintptr_t fcn) { pFpiii_t fn = (pFpiii_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX); }
 void pFpiip(x64emu_t *emu, uintptr_t fcn) { pFpiip_t fn = (pFpiip_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX, (void*)R_RCX); }
-void pFpiuu(x64emu_t *emu, uintptr_t fcn) { pFpiuu_t fn = (pFpiuu_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (int32_t)R_RSI, (uint32_t)R_RDX, (uint32_t)R_RCX); }
+void pFpiLL(x64emu_t *emu, uintptr_t fcn) { pFpiLL_t fn = (pFpiLL_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (int32_t)R_RSI, (uintptr_t)R_RDX, (uintptr_t)R_RCX); }
 void pFpipi(x64emu_t *emu, uintptr_t fcn) { pFpipi_t fn = (pFpipi_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (int32_t)R_RCX); }
 void pFpipp(x64emu_t *emu, uintptr_t fcn) { pFpipp_t fn = (pFpipp_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (void*)R_RCX); }
 void pFpCWp(x64emu_t *emu, uintptr_t fcn) { pFpCWp_t fn = (pFpCWp_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (uint8_t)R_RSI, (uint16_t)R_RDX, (void*)R_RCX); }
@@ -1538,6 +1545,8 @@ void pFEpiii(x64emu_t *emu, uintptr_t fcn) { pFEpiii_t fn = (pFEpiii_t)fcn; R_RA
 void pFEpipL(x64emu_t *emu, uintptr_t fcn) { pFEpipL_t fn = (pFEpipL_t)fcn; R_RAX=(uintptr_t)fn(emu, (void*)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (uintptr_t)R_RCX); }
 void pFEpipp(x64emu_t *emu, uintptr_t fcn) { pFEpipp_t fn = (pFEpipp_t)fcn; R_RAX=(uintptr_t)fn(emu, (void*)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (void*)R_RCX); }
 void pFEpupp(x64emu_t *emu, uintptr_t fcn) { pFEpupp_t fn = (pFEpupp_t)fcn; R_RAX=(uintptr_t)fn(emu, (void*)R_RDI, (uint32_t)R_RSI, (void*)R_RDX, (void*)R_RCX); }
+void pFEppii(x64emu_t *emu, uintptr_t fcn) { pFEppii_t fn = (pFEppii_t)fcn; R_RAX=(uintptr_t)fn(emu, (void*)R_RDI, (void*)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX); }
+void pFEppip(x64emu_t *emu, uintptr_t fcn) { pFEppip_t fn = (pFEppip_t)fcn; R_RAX=(uintptr_t)fn(emu, (void*)R_RDI, (void*)R_RSI, (int32_t)R_RDX, (void*)R_RCX); }
 void pFEpppp(x64emu_t *emu, uintptr_t fcn) { pFEpppp_t fn = (pFEpppp_t)fcn; R_RAX=(uintptr_t)fn(emu, (void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX); }
 void pFuiiiu(x64emu_t *emu, uintptr_t fcn) { pFuiiiu_t fn = (pFuiiiu_t)fcn; R_RAX=(uintptr_t)fn((uint32_t)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (uint32_t)R_R8); }
 void pFuiipp(x64emu_t *emu, uintptr_t fcn) { pFuiipp_t fn = (pFuiipp_t)fcn; R_RAX=(uintptr_t)fn((uint32_t)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX, (void*)R_RCX, (void*)R_R8); }
@@ -1617,6 +1626,7 @@ void iFEpuppp(x64emu_t *emu, uintptr_t fcn) { iFEpuppp_t fn = (iFEpuppp_t)fcn; R
 void iFEppppp(x64emu_t *emu, uintptr_t fcn) { iFEppppp_t fn = (iFEppppp_t)fcn; R_RAX=fn(emu, (void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8); }
 void iFiiiiii(x64emu_t *emu, uintptr_t fcn) { iFiiiiii_t fn = (iFiiiiii_t)fcn; R_RAX=fn((int32_t)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (int32_t)R_R8, (int32_t)R_R9); }
 void iFiiiiip(x64emu_t *emu, uintptr_t fcn) { iFiiiiip_t fn = (iFiiiiip_t)fcn; R_RAX=fn((int32_t)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (int32_t)R_R8, (void*)R_R9); }
+void iFiuiipi(x64emu_t *emu, uintptr_t fcn) { iFiuiipi_t fn = (iFiuiipi_t)fcn; R_RAX=fn((int32_t)R_RDI, (uint32_t)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (void*)R_R8, (int32_t)R_R9); }
 void iFuppipp(x64emu_t *emu, uintptr_t fcn) { iFuppipp_t fn = (iFuppipp_t)fcn; R_RAX=fn((uint32_t)R_RDI, (void*)R_RSI, (void*)R_RDX, (int32_t)R_RCX, (void*)R_R8, (void*)R_R9); }
 void iFuppppp(x64emu_t *emu, uintptr_t fcn) { iFuppppp_t fn = (iFuppppp_t)fcn; R_RAX=fn((uint32_t)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9); }
 void iFpiiiii(x64emu_t *emu, uintptr_t fcn) { iFpiiiii_t fn = (iFpiiiii_t)fcn; R_RAX=fn((void*)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (int32_t)R_R8, (int32_t)R_R9); }
diff --git a/src/wrapped/generated/wrapper.h b/src/wrapped/generated/wrapper.h
index b1cd2539..88ee6c40 100644
--- a/src/wrapped/generated/wrapper.h
+++ b/src/wrapped/generated/wrapper.h
@@ -224,6 +224,7 @@ void vFpup(x64emu_t *emu, uintptr_t fnc);
 void vFppi(x64emu_t *emu, uintptr_t fnc);
 void vFppu(x64emu_t *emu, uintptr_t fnc);
 void vFppp(x64emu_t *emu, uintptr_t fnc);
+void iFEiw(x64emu_t *emu, uintptr_t fnc);
 void iFEip(x64emu_t *emu, uintptr_t fnc);
 void iFEWW(x64emu_t *emu, uintptr_t fnc);
 void iFEup(x64emu_t *emu, uintptr_t fnc);
@@ -232,6 +233,7 @@ void iFEpL(x64emu_t *emu, uintptr_t fnc);
 void iFEpp(x64emu_t *emu, uintptr_t fnc);
 void iFEpV(x64emu_t *emu, uintptr_t fnc);
 void iFESp(x64emu_t *emu, uintptr_t fnc);
+void iFiwC(x64emu_t *emu, uintptr_t fnc);
 void iFiii(x64emu_t *emu, uintptr_t fnc);
 void iFiiu(x64emu_t *emu, uintptr_t fnc);
 void iFiip(x64emu_t *emu, uintptr_t fnc);
@@ -469,7 +471,7 @@ void pFippL(x64emu_t *emu, uintptr_t fnc);
 void pFuiii(x64emu_t *emu, uintptr_t fnc);
 void pFpiii(x64emu_t *emu, uintptr_t fnc);
 void pFpiip(x64emu_t *emu, uintptr_t fnc);
-void pFpiuu(x64emu_t *emu, uintptr_t fnc);
+void pFpiLL(x64emu_t *emu, uintptr_t fnc);
 void pFpipi(x64emu_t *emu, uintptr_t fnc);
 void pFpipp(x64emu_t *emu, uintptr_t fnc);
 void pFpCWp(x64emu_t *emu, uintptr_t fnc);
@@ -607,6 +609,8 @@ void pFEpiii(x64emu_t *emu, uintptr_t fnc);
 void pFEpipL(x64emu_t *emu, uintptr_t fnc);
 void pFEpipp(x64emu_t *emu, uintptr_t fnc);
 void pFEpupp(x64emu_t *emu, uintptr_t fnc);
+void pFEppii(x64emu_t *emu, uintptr_t fnc);
+void pFEppip(x64emu_t *emu, uintptr_t fnc);
 void pFEpppp(x64emu_t *emu, uintptr_t fnc);
 void pFuiiiu(x64emu_t *emu, uintptr_t fnc);
 void pFuiipp(x64emu_t *emu, uintptr_t fnc);
@@ -686,6 +690,7 @@ void iFEpuppp(x64emu_t *emu, uintptr_t fnc);
 void iFEppppp(x64emu_t *emu, uintptr_t fnc);
 void iFiiiiii(x64emu_t *emu, uintptr_t fnc);
 void iFiiiiip(x64emu_t *emu, uintptr_t fnc);
+void iFiuiipi(x64emu_t *emu, uintptr_t fnc);
 void iFuppipp(x64emu_t *emu, uintptr_t fnc);
 void iFuppppp(x64emu_t *emu, uintptr_t fnc);
 void iFpiiiii(x64emu_t *emu, uintptr_t fnc);
diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c
index 6ac5f32c..4910c6ab 100755
--- a/src/wrapped/wrappedlibc.c
+++ b/src/wrapped/wrappedlibc.c
@@ -1281,6 +1281,7 @@ EXPORT int32_t my_open(x64emu_t* emu, void* pathname, int32_t flags, uint32_t mo
         return tmp;
     }
     #endif
+if(!strcmp(pathname, "data.zip")) trace_end=0;
     int ret = open(pathname, flags, mode);
     return ret;
 }
diff --git a/src/wrapped/wrappedlibc_private.h b/src/wrapped/wrappedlibc_private.h
index 9db97834..b3e52f85 100755
--- a/src/wrapped/wrappedlibc_private.h
+++ b/src/wrapped/wrappedlibc_private.h
@@ -1086,8 +1086,8 @@ GOW(lseek, IFiIi)
 GOW(lseek64, IFiIi)
 //GO(lsetxattr, 
 //GO(lutimes, 
-//GO(__lxstat, iFipp)
-//GO(__lxstat64, iFipp)
+GOM(__lxstat, iFEipp)
+GOM(__lxstat64, iFEipp)
 //GO(__madvise, 
 //GOW(madvise, 
 GOM(makecontext, iFEppiV)   //weak
@@ -1136,31 +1136,31 @@ GO(__memmove_chk, pFppLL)
 //GOI(__mempcpy, 
 //GOI(mempcpy, 
 //GOI(__mempcpy_chk, 
-GOW(memrchr, pFpiu)
+GOW(memrchr, pFpiL)
 GO(memset, pFpiL)
-GO(__memset_chk, pFpiuu)
+GO(__memset_chk, pFpiLL)
 //GO(__mempcpy_small, 
 //GO(__merge_grp, 
-//GO(mincore, 
+GO(mincore, iFpLp)
 GOW(mkdir, iFpu)
 GO(mkdirat, iFipu)
 GO(mkdtemp, pFp)
 GO(mkfifo, iFpu)
 GO(mkfifoat, iFipu)
-//GO(mkostemp, 
-//GOW(mkostemp64, 
+GO(mkostemp, iFpi)
+GOW(mkostemp64, iFpi)
 //GO(mkostemps, 
 //GOW(mkostemps64, 
-//GO(mkstemp, 
-//GOW(mkstemp64, 
+GO(mkstemp, iFp)
+GOW(mkstemp64, iFp)
 //GO(mkstemps, 
 //GOW(mkstemps64, 
-//GO(__mktemp, 
-//GOW(mktemp, 
-//GO(mktime, 
-//GO(mlock, 
+GO(__mktemp, pFp)
+GOW(mktemp, pFp)
+GO(mktime, uFp)
+GO(mlock, iFpL)
 //GO(mlock2, 
-//GO(mlockall, 
+GO(mlockall, iFi)
 //GO(__mmap, 
 //GOW(mmap, 
 //GOW(mmap64, 
diff --git a/src/wrapped/wrappedsdl2image.c b/src/wrapped/wrappedsdl2image.c
new file mode 100755
index 00000000..6c514abf
--- /dev/null
+++ b/src/wrapped/wrappedsdl2image.c
@@ -0,0 +1,164 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#define _GNU_SOURCE         /* See feature_test_macros(7) */
+#include <dlfcn.h>
+
+#include "wrappedlibs.h"
+
+#include "debug.h"
+#include "wrapper.h"
+#include "bridge.h"
+#include "librarian/library_private.h"
+#include "x64emu.h"
+#include "emu/x64emu_private.h"
+#include "box64context.h"
+#include "sdl2rwops.h"
+
+typedef void* (*pFpi_t)(void*, int32_t);
+typedef void* (*pFp_t)(void*);
+typedef void* (*pFpip_t)(void*, int32_t, void*);
+typedef void* (*pFppi_t)(void*, void*, int32_t);
+typedef int32_t (*iFppi_t)(void*, void*, int32_t);
+typedef void* (*pFppip_t)(void*, void*, int32_t, void*);
+
+typedef struct sdl2image_my_s {
+    pFp_t       IMG_LoadBMP_RW;
+    pFp_t       IMG_LoadCUR_RW;
+    pFp_t       IMG_LoadGIF_RW;
+    pFp_t       IMG_LoadICO_RW;
+    pFp_t       IMG_LoadJPG_RW;
+    pFp_t       IMG_LoadLBM_RW;
+    pFp_t       IMG_LoadPCX_RW;
+    pFp_t       IMG_LoadPNG_RW;
+    pFp_t       IMG_LoadPNM_RW;
+    pFp_t       IMG_LoadTGA_RW;
+    pFp_t       IMG_LoadTIF_RW;
+    pFpip_t     IMG_LoadTyped_RW;
+    pFp_t       IMG_LoadWEBP_RW;
+    pFp_t       IMG_LoadXCF_RW;
+    pFp_t       IMG_LoadXPM_RW;
+    pFp_t       IMG_LoadXV_RW;
+    pFpi_t      IMG_Load_RW;
+    iFppi_t     IMG_SavePNG_RW;
+    pFppi_t     IMG_LoadTexture_RW;
+    pFppip_t    IMG_LoadTextureTyped_RW;
+} sdl2image_my_t;
+
+static library_t* my_lib = NULL;
+
+static void* getSDL2ImageMy(library_t* lib)
+{
+    sdl2image_my_t* my = (sdl2image_my_t*)calloc(1, sizeof(sdl2image_my_t));
+    #define GO(A, W) my->A = (W)dlsym(lib->priv.w.lib, #A);
+    GO(IMG_LoadBMP_RW,pFp_t)
+    GO(IMG_LoadCUR_RW,pFp_t)
+    GO(IMG_LoadGIF_RW,pFp_t)
+    GO(IMG_LoadICO_RW,pFp_t)
+    GO(IMG_LoadJPG_RW,pFp_t)
+    GO(IMG_LoadLBM_RW,pFp_t)
+    GO(IMG_LoadPCX_RW,pFp_t)
+    GO(IMG_LoadPNG_RW,pFp_t)
+    GO(IMG_LoadPNM_RW,pFp_t)
+    GO(IMG_LoadTGA_RW,pFp_t)
+    GO(IMG_LoadTIF_RW,pFp_t)
+    GO(IMG_LoadTyped_RW,pFpip_t)
+    GO(IMG_LoadWEBP_RW,pFp_t)
+    GO(IMG_LoadXCF_RW,pFp_t)
+    GO(IMG_LoadXPM_RW,pFp_t)
+    GO(IMG_LoadXV_RW,pFp_t)
+    GO(IMG_Load_RW,pFpi_t)
+    GO(IMG_SavePNG_RW, iFppi_t)
+    GO(IMG_LoadTexture_RW, pFppi_t)
+    GO(IMG_LoadTextureTyped_RW, pFppip_t)
+    #undef GO
+    return my;
+}
+
+#define GO(A) \
+EXPORT void *my2_##A(x64emu_t* emu, void* a) \
+{ \
+    sdl2image_my_t *my = (sdl2image_my_t *)my_lib->priv.w.p2; \
+    SDL2_RWops_t *rw = RWNativeStart2(emu, (SDL2_RWops_t*)a); \
+    void* r = my->A(rw); \
+    RWNativeEnd2(rw); \
+    return r; \
+}
+GO(IMG_LoadBMP_RW)
+GO(IMG_LoadCUR_RW)
+GO(IMG_LoadGIF_RW)
+GO(IMG_LoadICO_RW)
+GO(IMG_LoadJPG_RW)
+GO(IMG_LoadLBM_RW)
+GO(IMG_LoadPCX_RW)
+GO(IMG_LoadPNG_RW)
+GO(IMG_LoadPNM_RW)
+GO(IMG_LoadTGA_RW)
+GO(IMG_LoadTIF_RW)
+GO(IMG_LoadWEBP_RW)
+GO(IMG_LoadXCF_RW)
+GO(IMG_LoadXPM_RW)
+GO(IMG_LoadXV_RW)
+#undef GO
+
+ EXPORT void *my2_IMG_LoadTyped_RW(x64emu_t* emu, void* a, int32_t b, void* c)
+{
+    sdl2image_my_t *my = (sdl2image_my_t *)my_lib->priv.w.p2;
+    SDL2_RWops_t *rw = RWNativeStart2(emu, (SDL2_RWops_t*)a);
+    void* r = my->IMG_LoadTyped_RW(rw, b, c);
+    if(b==0)
+        RWNativeEnd2(rw);
+    return r;
+}
+EXPORT void *my2_IMG_Load_RW(x64emu_t* emu, void* a, int32_t b)
+{
+    sdl2image_my_t *my = (sdl2image_my_t *)my_lib->priv.w.p2;
+    SDL2_RWops_t *rw = RWNativeStart2(emu, (SDL2_RWops_t*)a);
+    void* r = my->IMG_Load_RW(rw, b);
+    if(b==0)
+        RWNativeEnd2(rw);
+    return r;
+}
+EXPORT int32_t my2_IMG_SavePNG_RW(x64emu_t* emu, void* a, void* surf, int32_t compression)
+{
+    sdl2image_my_t *my = (sdl2image_my_t *)my_lib->priv.w.p2;
+    SDL2_RWops_t *rw = RWNativeStart2(emu, (SDL2_RWops_t*)a);
+    int32_t r = my->IMG_SavePNG_RW(rw, surf, compression);
+    RWNativeEnd2(rw);
+    return r;
+}
+
+EXPORT void* my2_IMG_LoadTexture_RW(x64emu_t* emu, void* rend, void* a, int32_t b)
+{
+    sdl2image_my_t *my = (sdl2image_my_t *)my_lib->priv.w.p2;
+    SDL2_RWops_t *rw = RWNativeStart2(emu, (SDL2_RWops_t*)a);
+    void* r = my->IMG_LoadTexture_RW(rend, rw, b);
+    if(b==0)
+        RWNativeEnd2(rw);
+    return r;
+}
+
+EXPORT void* my2_IMG_LoadTextureTyped_RW(x64emu_t* emu, void* rend, void* a, int32_t b, void* type)
+{
+    sdl2image_my_t *my = (sdl2image_my_t *)my_lib->priv.w.p2;
+    SDL2_RWops_t *rw = RWNativeStart2(emu, (SDL2_RWops_t*)a);
+    void* r = my->IMG_LoadTextureTyped_RW(rend, rw, b, type);
+    if(b==0)
+        RWNativeEnd2(rw);
+    return r;
+}
+
+const char* sdl2imageName = "libSDL2_image-2.0.so.0";
+#define LIBNAME sdl2image
+
+#define CUSTOM_INIT \
+    my_lib = lib; \
+    lib->priv.w.p2 = getSDL2ImageMy(lib); \
+    lib->altmy = strdup("my2_");
+
+#define CUSTOM_FINI \
+    free(lib->priv.w.p2); \
+    my_lib = NULL;
+
+#include "wrappedlib_init.h"
+
diff --git a/src/wrapped/wrappedsdl2image_private.h b/src/wrapped/wrappedsdl2image_private.h
new file mode 100755
index 00000000..7c4af99d
--- /dev/null
+++ b/src/wrapped/wrappedsdl2image_private.h
@@ -0,0 +1,69 @@
+#if defined(GO) && defined(GOM) && defined(GO2) && defined(DATA)
+
+DATA(__data_start, 4)
+DATA(_edata, 4)
+// _fini
+GO(IMG_Init,iFi)
+GO(IMG_InvertAlpha,iFi)
+GO(IMG_Linked_Version,pFv)
+GO(IMG_Load,pFp)
+GOM(IMG_LoadBMP_RW,pFEp)
+GOM(IMG_LoadCUR_RW,pFEp)
+GOM(IMG_LoadGIF_RW,pFEp)
+GOM(IMG_LoadICO_RW,pFEp)
+GOM(IMG_LoadJPG_RW,pFEp)
+GOM(IMG_LoadLBM_RW,pFEp)
+GOM(IMG_LoadPCX_RW,pFEp)
+GOM(IMG_LoadPNG_RW,pFEp)
+GOM(IMG_LoadPNM_RW,pFEp)
+GOM(IMG_LoadTGA_RW,pFEp)
+GOM(IMG_LoadTIF_RW,pFEp)
+GOM(IMG_LoadTyped_RW,pFEpip)
+GOM(IMG_LoadWEBP_RW,pFEp)
+GOM(IMG_LoadXCF_RW,pFEp)
+GOM(IMG_LoadXPM_RW,pFEp)
+GOM(IMG_LoadXV_RW,pFEp)
+GOM(IMG_Load_RW,pFEpi)
+GO(IMG_Quit,vFv)
+GO(IMG_ReadXPMFromArray,pFp)
+GO(IMG_isBMP,iFp)
+GO(IMG_isCUR,iFp)
+GO(IMG_isGIF,iFp)
+GO(IMG_isICO,iFp)
+GO(IMG_isJPG,iFp)
+GO(IMG_isLBM,iFp)
+GO(IMG_isPCX,iFp)
+GO(IMG_isPNG,iFp)
+GO(IMG_isPNM,iFp)
+GO(IMG_isTIF,iFp)
+GO(IMG_isWEBP,iFp)
+GO(IMG_isXCF,iFp)
+GO(IMG_isXPM,iFp)
+GO(IMG_isXV,iFp)
+// IMG_InitJPG
+// IMG_InitPNG
+// IMG_InitTIF
+// IMG_InitWEBP
+// IMG_isSVG
+// IMG_LoadSVG_RW
+GO(IMG_LoadTexture, pFpp)
+GOM(IMG_LoadTexture_RW, pFEppi)
+GOM(IMG_LoadTextureTyped_RW, pFEppip)
+// IMG_QuitJPG
+// IMG_QuitPNG
+// IMG_QuitTIF
+// IMG_QuitWEBP
+// IMG_SaveJPG
+// IMG_SaveJPG_RW
+GO(IMG_SavePNG, iFppi)
+GOM(IMG_SavePNG_RW, iFEppi)
+// _init
+DATA(nsvg__colors, 4)
+// nsvgCreateRasterizer
+// nsvgDelete
+// nsvgDeleteRasterizer
+// nsvgParse
+// nsvg__parseXML
+// nsvgRasterize
+
+#endif
\ No newline at end of file
diff --git a/src/wrapped/wrappedsdl2mixer.c b/src/wrapped/wrappedsdl2mixer.c
new file mode 100755
index 00000000..e8901c5f
--- /dev/null
+++ b/src/wrapped/wrappedsdl2mixer.c
@@ -0,0 +1,284 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#define _GNU_SOURCE         /* See feature_test_macros(7) */
+#include <dlfcn.h>
+
+#include "wrappedlibs.h"
+
+#include "debug.h"
+#include "wrapper.h"
+#include "bridge.h"
+#include "librarian/library_private.h"
+#include "x64emu.h"
+#include "emu/x64emu_private.h"
+#include "box64context.h"
+#include "sdl2rwops.h"
+#include "callback.h"
+
+typedef void* (*pFpi_t)(void*, int32_t);
+typedef int32_t(*iFip_t)(int32_t, void*);
+typedef void* (*pFpii_t)(void*, int32_t, int32_t);
+typedef void  (*vFpp_t)(void*, void*);
+typedef void  (*vFp_t)(void*);
+typedef int32_t (*iFippp_t)(int32_t, void*, void*, void*);
+typedef int   (*iFiwC_t)(int, int16_t, uint8_t);
+
+#define SUPER() \
+    GO(Mix_LoadMUSType_RW,pFpii_t)      \
+    GO(Mix_LoadMUS_RW,pFpi_t)           \
+    GO(Mix_LoadWAV_RW,pFpi_t)           \
+    GO(Mix_SetPostMix,vFpp_t)           \
+    GO(Mix_RegisterEffect, iFippp_t)    \
+    GO(Mix_UnregisterEffect, iFip_t)    \
+    GO(Mix_ChannelFinished,vFp_t)       \
+    GO(Mix_HookMusic, vFpp_t)           \
+    GO(Mix_HookMusicFinished, vFp_t)    \
+    GO(Mix_SetPosition, iFiwC_t)        \
+
+typedef struct sdl2mixer_my_s {
+    #define GO(A, B)    B   A;
+    SUPER()
+    #undef GO
+
+    x64emu_t* PostCallback;
+    x64emu_t* hookMusicCB;
+} sdl2mixer_my_t;
+
+static void* getSDL2MixerMy(library_t* lib)
+{
+    sdl2mixer_my_t* my = (sdl2mixer_my_t*)calloc(1, sizeof(sdl2mixer_my_t));
+    #define GO(A, W) my->A = (W)dlsym(lib->priv.w.lib, #A);
+    SUPER()
+    #undef GO
+
+    return my;
+}
+
+static void freeSDL2MixerMy(library_t* lib)
+{
+//    sdl2mixer_my_t *my = lib->priv.w.p2;
+}
+
+#undef SUPER
+
+#define SUPER() \
+GO(0)   \
+GO(1)   \
+GO(2)   \
+GO(3)   \
+GO(4)
+
+// EffectFunc
+#define GO(A)   \
+static uintptr_t my_EffectFunc_fct_##A = 0;                                         \
+static void my_EffectFunc_##A(int chan, void *stream, int len, void *udata)         \
+{                                                                                   \
+    RunFunction(my_context, my_EffectFunc_fct_##A, 4, chan, stream, len, udata);    \
+}
+SUPER()
+#undef GO
+static void* find_EffectFunc_Fct(void* fct)
+{
+    if(!fct) return NULL;
+    void* p;
+    if((p = GetNativeFnc((uintptr_t)fct))) return p;
+    #define GO(A) if(my_EffectFunc_fct_##A == (uintptr_t)fct) return my_EffectFunc_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_EffectFunc_fct_##A == 0) {my_EffectFunc_fct_##A = (uintptr_t)fct; return my_EffectFunc_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for SDL1Mixer EffectFunc callback\n");
+    return NULL;
+}
+
+// EffectDone
+#define GO(A)   \
+static uintptr_t my_EffectDone_fct_##A = 0;                         \
+static void my_EffectDone_##A(int chan, void *udata)                \
+{                                                                   \
+    RunFunction(my_context, my_EffectDone_fct_##A, 2, chan, udata); \
+}
+SUPER()
+#undef GO
+static void* find_EffectDone_Fct(void* fct)
+{
+    if(!fct) return NULL;
+    void* p;
+    if((p = GetNativeFnc((uintptr_t)fct))) return p;
+    #define GO(A) if(my_EffectDone_fct_##A == (uintptr_t)fct) return my_EffectDone_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_EffectDone_fct_##A == 0) {my_EffectDone_fct_##A = (uintptr_t)fct; return my_EffectDone_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for SDL1Mixer EffectDone callback\n");
+    return NULL;
+}
+
+// MixFunc
+#define GO(A)   \
+static uintptr_t my_MixFunc_fct_##A = 0;                                \
+static void my_MixFunc_##A(void *udata, uint8_t *stream, int len)       \
+{                                                                       \
+    RunFunction(my_context, my_MixFunc_fct_##A, 3, udata, stream, len); \
+}
+SUPER()
+#undef GO
+static void* find_MixFunc_Fct(void* fct)
+{
+    if(!fct) return NULL;
+    void* p;
+    if((p = GetNativeFnc((uintptr_t)fct))) return p;
+    #define GO(A) if(my_MixFunc_fct_##A == (uintptr_t)fct) return my_MixFunc_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_MixFunc_fct_##A == 0) {my_MixFunc_fct_##A = (uintptr_t)fct; return my_MixFunc_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for SDL1Mixer MixFunc callback\n");
+    return NULL;
+}
+
+// ChannelFinished
+#define GO(A)   \
+static uintptr_t my_ChannelFinished_fct_##A = 0;                        \
+static void my_ChannelFinished_##A(int channel)                         \
+{                                                                       \
+    RunFunction(my_context, my_ChannelFinished_fct_##A, 1, channel);    \
+}
+SUPER()
+#undef GO
+static void* find_ChannelFinished_Fct(void* fct)
+{
+    if(!fct) return NULL;
+    void* p;
+    if((p = GetNativeFnc((uintptr_t)fct))) return p;
+    #define GO(A) if(my_ChannelFinished_fct_##A == (uintptr_t)fct) return my_ChannelFinished_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_ChannelFinished_fct_##A == 0) {my_ChannelFinished_fct_##A = (uintptr_t)fct; return my_ChannelFinished_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for SDL1Mixer ChannelFinished callback\n");
+    return NULL;
+}
+
+// MusicFinished
+#define GO(A)   \
+static uintptr_t my_MusicFinished_fct_##A = 0;              \
+static void my_MusicFinished_##A()                          \
+{                                                           \
+    RunFunction(my_context, my_MusicFinished_fct_##A, 0);   \
+}
+SUPER()
+#undef GO
+static void* find_MusicFinished_Fct(void* fct)
+{
+    if(!fct) return NULL;
+    void* p;
+    if((p = GetNativeFnc((uintptr_t)fct))) return p;
+    #define GO(A) if(my_MusicFinished_fct_##A == (uintptr_t)fct) return my_MusicFinished_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_MusicFinished_fct_##A == 0) {my_MusicFinished_fct_##A = (uintptr_t)fct; return my_MusicFinished_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for SDL1Mixer MusicFinished callback\n");
+    return NULL;
+}
+
+#undef SUPER
+
+EXPORT void* my2_Mix_LoadMUSType_RW(x64emu_t* emu, void* a, int32_t b, int32_t c)
+{
+    sdl2mixer_my_t *my = (sdl2mixer_my_t *)emu->context->sdl2mixerlib->priv.w.p2;
+    SDL2_RWops_t *rw = RWNativeStart2(emu, (SDL2_RWops_t*)a);
+    void* r = my->Mix_LoadMUSType_RW(rw, b, c);
+    if(c==0)
+        RWNativeEnd2(rw);
+    return r;
+}
+EXPORT void* my2_Mix_LoadMUS_RW(x64emu_t* emu, void* a, int32_t f)
+{
+    sdl2mixer_my_t *my = (sdl2mixer_my_t *)emu->context->sdl2mixerlib->priv.w.p2;
+    SDL2_RWops_t *rw = RWNativeStart2(emu, (SDL2_RWops_t*)a);
+    void* r = my->Mix_LoadMUS_RW(rw, f);
+    if(f==0)
+        RWNativeEnd2(rw);  // this one never free the RWops
+    return r;
+}
+EXPORT void* my2_Mix_LoadWAV_RW(x64emu_t* emu, void* a, int32_t f)
+{
+    sdl2mixer_my_t *my = (sdl2mixer_my_t *)emu->context->sdl2mixerlib->priv.w.p2;
+    SDL2_RWops_t *rw = RWNativeStart2(emu, (SDL2_RWops_t*)a);
+    void* r = my->Mix_LoadWAV_RW(rw, f);
+    if(f==0)
+        RWNativeEnd2(rw);
+    return r;
+}
+
+EXPORT void my2_Mix_SetPostMix(x64emu_t* emu, void* a, void* b)
+{
+    sdl2mixer_my_t *my = (sdl2mixer_my_t *)emu->context->sdl2mixerlib->priv.w.p2;
+    my->Mix_SetPostMix(find_MixFunc_Fct(a), b);
+}
+
+EXPORT int32_t my2_Mix_RegisterEffect(x64emu_t*emu, int32_t channel, void* cb_effect, void* cb_done, void* arg)
+{
+    sdl2mixer_my_t *my = (sdl2mixer_my_t *)emu->context->sdl2mixerlib->priv.w.p2;
+
+    return my->Mix_RegisterEffect(channel, find_EffectFunc_Fct(cb_effect), find_EffectDone_Fct(cb_done), arg);
+}
+
+EXPORT int32_t my2_Mix_UnregisterEffect(x64emu_t* emu, int channel, void* f)
+{
+    sdl2mixer_my_t *my = (sdl2mixer_my_t *)emu->context->sdl2mixerlib->priv.w.p2;
+
+    return my->Mix_UnregisterEffect(channel, find_EffectFunc_Fct(f));
+}
+
+EXPORT void my2_Mix_ChannelFinished(x64emu_t* emu, void* cb)
+{
+    sdl2mixer_my_t *my = (sdl2mixer_my_t *)emu->context->sdl2mixerlib->priv.w.p2;
+
+    my->Mix_ChannelFinished(find_ChannelFinished_Fct(cb));
+}
+
+EXPORT void my2_Mix_HookMusic(x64emu_t* emu, void* f, void* arg)
+{
+    sdl2mixer_my_t *my = (sdl2mixer_my_t *)emu->context->sdl2mixerlib->priv.w.p2;
+
+    my->Mix_HookMusic(find_MixFunc_Fct(f), arg);
+}
+
+EXPORT void my2_Mix_HookMusicFinished(x64emu_t* emu, void* f)
+{
+    sdl2mixer_my_t *my = (sdl2mixer_my_t *)emu->context->sdl2mixerlib->priv.w.p2;
+
+    my->Mix_HookMusicFinished(find_MusicFinished_Fct(f));
+}
+
+// This is a hack for AntiChamber
+EXPORT int my2_MinorityMix_SetPosition(x64emu_t* emu, int channel, int16_t angle)
+{
+    sdl2mixer_my_t *my = (sdl2mixer_my_t *)emu->context->sdl2mixerlib->priv.w.p2;
+    return my->Mix_SetPosition(channel, angle, 0);
+}
+
+const char* sdl2mixerName = "libSDL2_mixer-2.0.so.0";
+#define LIBNAME sdl2mixer
+
+#define CUSTOM_INIT \
+    box64->sdl2mixerlib = lib; \
+    lib->priv.w.p2 = getSDL2MixerMy(lib); \
+    lib->altmy = strdup("my2_");
+
+#define CUSTOM_FINI \
+    freeSDL2MixerMy(lib); \
+    free(lib->priv.w.p2); \
+    ((box64context_t*)(lib->context))->sdl2mixerlib = NULL;
+
+#include "wrappedlib_init.h"
+
diff --git a/src/wrapped/wrappedsdl2mixer_private.h b/src/wrapped/wrappedsdl2mixer_private.h
new file mode 100755
index 00000000..58d8e371
--- /dev/null
+++ b/src/wrapped/wrappedsdl2mixer_private.h
@@ -0,0 +1,86 @@
+#if !(defined(GO) && defined(GOM) && defined(GO2) && defined(DATA))
+#error meh!
+#endif
+
+DATA(__data_start, 4)
+DATA(_edata, 4)
+// _fini
+// _init
+GO(Mix_AllocateChannels, iFi)
+GOM(Mix_ChannelFinished, vFEp)
+GO(Mix_CloseAudio, vFv)
+// Mix_EachSoundFont
+GO(Mix_ExpireChannel,iFii)
+GO(Mix_FadeInChannelTimed,iFipiii)
+GO(Mix_FadeInMusic,iFpii)
+GO(Mix_FadeInMusicPos,iFpiid)
+GO(Mix_FadeOutChannel,iFii)
+GO(Mix_FadeOutGroup,iFii)
+GO(Mix_FadeOutMusic,iFi)
+GO(Mix_FadingChannel,iFi)
+GO(Mix_FadingMusic,iFv)
+GO(Mix_FreeChunk,vFp)
+GO(Mix_FreeMusic,vFp)
+GO(Mix_GetChunk,pFi)
+GO(Mix_GetChunkDecoder,pFi)
+GO(Mix_GetMusicDecoder,pFi)
+GO(Mix_GetMusicHookData,pFv)
+GO(Mix_GetMusicType,iFp)
+GO(Mix_GetNumChunkDecoders,iFv)
+GO(Mix_GetNumMusicDecoders,iFv)
+GO(Mix_GetSoundFonts,pFv)
+GO(Mix_GetSynchroValue,iFv)
+GO(Mix_GroupAvailable,iFi)
+GO(Mix_GroupChannel,iFii)
+GO(Mix_GroupChannels,iFiii)
+GO(Mix_GroupCount,iFi)
+GO(Mix_GroupNewer,iFi)
+GO(Mix_GroupOldest,iFi)
+GO(Mix_HaltChannel,iFi)
+GO(Mix_HaltGroup,iFi)
+GO(Mix_HaltMusic,iFv)
+// Mix_HasChunkDecoder
+GOM(Mix_HookMusic, vFEpp)
+GOM(Mix_HookMusicFinished, vFEp)
+GO(Mix_Init,iFi)
+GO(Mix_Linked_Version,pFv)
+GO(Mix_LoadMUS,pFp)
+GOM(Mix_LoadMUSType_RW,pFEpii)
+GOM(Mix_LoadMUS_RW,pFEpi)
+GOM(Mix_LoadWAV_RW,pFEpi)
+GO(Mix_OpenAudio,iFiuii)
+GO(Mix_OpenAudioDevice, iFiuiipi)
+GO(Mix_Pause,vFi)
+GO(Mix_PauseMusic,vFv)
+GO(Mix_Paused,iFi)
+GO(Mix_PausedMusic,iFv)
+GO(Mix_PlayChannelTimed,iFipii)
+GO(Mix_PlayMusic,iFpi)
+GO(Mix_Playing,iFi)
+GO(Mix_PlayingMusic,iFv)
+GO(Mix_QuerySpec,iFppp)
+GO(Mix_QuickLoad_RAW,pFpu)
+GO(Mix_QuickLoad_WAV,pFp)
+GO(Mix_Quit,vFv)
+GO(Mix_Pause, vFi)
+GOM(Mix_RegisterEffect, iFEippp)
+GO(Mix_ReserveChannels,iFi)
+GO(Mix_Resume,vFi)
+GO(Mix_ResumeMusic,vFv)
+GO(Mix_RewindMusic,vFv)
+GO(Mix_SetDistance,iFiu)
+GO(Mix_SetMusicCMD,iFp)
+GO(Mix_SetMusicPosition,iFd)
+GO(Mix_SetPanning,iFiuu)
+GO(Mix_SetPosition,iFiwC)
+GOM(MinorityMix_SetPosition, iFEiw)
+GOM(Mix_SetPostMix,vFEpp)
+GO(Mix_SetReverseStereo,iFii)
+GO(Mix_SetSoundFonts,iFp)
+GO(Mix_SetSynchroValue,iFi)
+GO(Mix_UnregisterAllEffects, iFi)
+GOM(Mix_UnregisterEffect, iFEip) 
+GO(Mix_Volume,iFii)
+GO(Mix_VolumeChunk,iFpi)
+GO(Mix_VolumeMusic,iFi)
+
diff --git a/src/wrapped/wrappedsdl2ttf.c b/src/wrapped/wrappedsdl2ttf.c
new file mode 100755
index 00000000..9e92b871
--- /dev/null
+++ b/src/wrapped/wrappedsdl2ttf.c
@@ -0,0 +1,71 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#define _GNU_SOURCE         /* See feature_test_macros(7) */
+#include <dlfcn.h>
+
+#include "wrappedlibs.h"
+
+#include "debug.h"
+#include "wrapper.h"
+#include "bridge.h"
+#include "librarian/library_private.h"
+#include "x64emu.h"
+#include "emu/x64emu_private.h"
+#include "box64context.h"
+#include "sdl2rwops.h"
+
+typedef void* (*pFpii_t)(void*, int32_t, int32_t);
+typedef void* (*pFpiii_t)(void*, int32_t, int32_t, int32_t);
+
+typedef struct sdl2ttf_my_s {
+    pFpii_t     TTF_OpenFontRW;
+    pFpiii_t    TTF_OpenFontIndexRW;
+} sdl2ttf_my_t;
+
+static void* getSDL2TTFMy(library_t* lib)
+{
+    sdl2ttf_my_t* my = (sdl2ttf_my_t*)calloc(1, sizeof(sdl2ttf_my_t));
+    #define GO(A, W) my->A = (W)dlsym(lib->priv.w.lib, #A);
+    GO(TTF_OpenFontIndexRW,pFpiii_t)
+    GO(TTF_OpenFontRW, pFpii_t)
+    #undef GO
+    return my;
+}
+
+static library_t* my_lib = NULL;
+
+void EXPORT *my2_TTF_OpenFontIndexRW(x64emu_t* emu, void* a, int32_t b, int32_t c, int32_t d)
+{
+    sdl2ttf_my_t *my = (sdl2ttf_my_t *)my_lib->priv.w.p2;
+    SDL2_RWops_t* rw = RWNativeStart2(emu, (SDL2_RWops_t*)a);
+    void* r = my->TTF_OpenFontIndexRW(rw, b, c, d);
+    if(b==0)
+        RWNativeEnd2(rw);
+    return r;
+}
+
+void EXPORT *my2_TTF_OpenFontRW(x64emu_t* emu, void* a, int32_t b, int32_t c)
+{
+    sdl2ttf_my_t *my = (sdl2ttf_my_t *)my_lib->priv.w.p2;
+    SDL2_RWops_t* rw = RWNativeStart2(emu, (SDL2_RWops_t*)a);
+    void* r = my->TTF_OpenFontRW(rw, b, c);
+    if(b==0)
+        RWNativeEnd2(rw);
+    return r;
+}
+
+const char* sdl2ttfName = "libSDL2_ttf-2.0.so.0";
+#define LIBNAME sdl2ttf
+
+#define CUSTOM_INIT                     \
+    my_lib = lib;                       \
+    lib->altmy = strdup("my2_");        \
+    lib->priv.w.p2 = getSDL2TTFMy(lib);
+
+#define CUSTOM_FINI                     \
+    free(lib->priv.w.p2);               \
+    my_lib = NULL;
+
+#include "wrappedlib_init.h"
+
diff --git a/src/wrapped/wrappedsdl2ttf_private.h b/src/wrapped/wrappedsdl2ttf_private.h
new file mode 100755
index 00000000..a115d99f
--- /dev/null
+++ b/src/wrapped/wrappedsdl2ttf_private.h
@@ -0,0 +1,49 @@
+#if !(defined(GO) && defined(GOM) && defined(GO2) && defined(DATA))
+#error Meh!
+#endif
+
+GO(TTF_ByteSwappedUNICODE, vFi)
+GO(TTF_CloseFont, vFp)
+GO(TTF_FontAscent, iFp)
+GO(TTF_FontDescent, iFp)
+GO(TTF_FontFaceFamilyName, pFp)
+GO(TTF_FontFaceIsFixedWidth, iFp)
+GO(TTF_FontFaces, iFp)
+GO(TTF_FontFaceStyleName, pFp)
+GO(TTF_FontHeight, iFp)
+GO(TTF_FontLineSkip, iFp)
+GO(TTF_GetFontHinting, iFp)
+GO(TTF_GetFontKerning, iFp)
+GO(TTF_GetFontKerningSize, iFp)
+GO(TTF_GetFontOutline, iFp)
+GO(TTF_GetFontStyle, iFp)
+GO(TTF_GlyphIsProvided, iFpu)
+GO(TTF_GlyphMetrics, iFpuppppp)
+GO(TTF_Init, iFv)
+GO(TTF_Linked_Version, pFv)
+GO(TTF_OpenFont, pFpi)
+GO(TTF_OpenFontIndex, pFpii)
+GOM(TTF_OpenFontIndexRW, pFEpiii)
+GOM(TTF_OpenFontRW, pFEpii)
+GO(TTF_Quit, vFv)
+GO(TTF_RenderGlyph_Blended, pFpuu)
+GO(TTF_RenderGlyph_Shaded, pFpuuu)
+GO(TTF_RenderGlyph_Solid, pFpuu)
+GO(TTF_RenderText_Blended, pFppu)
+GO(TTF_RenderText_Shaded, pFppuu)
+GO(TTF_RenderText_Solid, pFppu)
+GO(TTF_RenderUNICODE_Blended, pFppu)
+GO(TTF_RenderUNICODE_Shaded, pFppuu)
+GO(TTF_RenderUNICODE_Solid, pFppu)
+GO(TTF_RenderUTF8_Blended, pFppu)
+GO(TTF_RenderUTF8_Shaded, pFppuu)
+GO(TTF_RenderUTF8_Solid, pFppu)
+GO(TTF_SetFontHinting, vFpi)
+GO(TTF_SetFontKerning, vFpi)
+GO(TTF_SetFontOutline, vFpi)
+GO(TTF_SetFontStyle, vFpi)
+GO(TTF_SizeText, iFpppp)
+GO(TTF_SizeUNICODE, iFpppp)
+GO(TTF_SizeUTF8, iFpppp)
+GO(TTF_WasInit, iFv)
+
diff --git a/src/wrapped/wrappedsmpeg2.c b/src/wrapped/wrappedsmpeg2.c
new file mode 100755
index 00000000..eac26700
--- /dev/null
+++ b/src/wrapped/wrappedsmpeg2.c
@@ -0,0 +1,111 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#define _GNU_SOURCE         /* See feature_test_macros(7) */
+#include <dlfcn.h>
+
+#include "wrappedlibs.h"
+
+#include "debug.h"
+#include "wrapper.h"
+#include "bridge.h"
+#include "librarian/library_private.h"
+#include "librarian.h"
+#include "x64emu.h"
+#include "callback.h"
+#include "box64context.h"
+#include "sdl2rwops.h"
+#include "myalign.h"
+
+const char* smpeg2Name = "libsmpeg2-2.0.so.0";
+#define LIBNAME smpeg2
+
+typedef void (*vFpp_t)(void*, void*);
+typedef void (*vFpppp_t)(void*, void*, void*, void*);
+typedef void* (*pFppi_t)(void*, void*, int32_t);
+typedef void* (*pFipi_t)(int32_t, void*, int32_t);
+typedef void* (*pFpipi_t)(void*, int32_t, void*, int32_t);
+typedef void* (*pFppii_t)(void*, void*, int32_t, int32_t);
+
+typedef struct smpeg2_my_s {
+    // functions
+    vFpppp_t    SMPEG_setdisplay;
+    pFppii_t    SMPEG_new_rwops;
+} smpeg2_my_t;
+
+static void* getSMPEG2My(library_t* lib)
+{
+    smpeg2_my_t* my = (smpeg2_my_t*)calloc(1, sizeof(smpeg2_my_t));
+    #define GO(A, W) my->A = (W)dlsym(lib->priv.w.lib, #A);
+    GO(SMPEG_setdisplay, vFpppp_t)
+    GO(SMPEG_new_rwops, pFppii_t)
+    #undef GO
+    return my;
+}
+
+static void freeSMPEG2My(void* lib)
+{
+    //smpeg2_my_t *my = (smpeg2_my_t *)lib;
+}
+
+#define SUPER() \
+GO(0)   \
+GO(1)   \
+GO(2)   \
+GO(3)   \
+GO(4)
+
+// dispcallback ...
+#define GO(A)   \
+static uintptr_t my_dispcallback_fct_##A = 0;                           \
+static void my_dispcallback_##A(void* data, void* frame)                \
+{                                                                       \
+    RunFunction(my_context, my_dispcallback_fct_##A, 2, data, frame);   \
+}
+SUPER()
+#undef GO
+static void* find_dispcallback_Fct(void* fct)
+{
+    if(!fct) return fct;
+    if(GetNativeFnc((uintptr_t)fct))  return GetNativeFnc((uintptr_t)fct);
+    #define GO(A) if(my_dispcallback_fct_##A == (uintptr_t)fct) return my_dispcallback_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_dispcallback_fct_##A == 0) {my_dispcallback_fct_##A = (uintptr_t)fct; return my_dispcallback_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for libsmpeg2 dispcallback callback\n");
+    return NULL;
+}
+#undef SUPER
+
+
+EXPORT void my2_SMPEG_setdisplay(x64emu_t* emu, void* mpeg, void* cb, void* data, void* lock)
+{
+    library_t* lib = GetLibInternal(smpeg2Name);
+    smpeg2_my_t* my = (smpeg2_my_t*)lib->priv.w.p2;
+    my->SMPEG_setdisplay(mpeg, find_dispcallback_Fct(cb), data, lock);
+}
+
+EXPORT void* my2_SMPEG_new_rwops(x64emu_t* emu, void* src, void* info, int32_t f, int32_t audio)
+{
+    library_t* lib = GetLibInternal(smpeg2Name);
+    smpeg2_my_t* my = (smpeg2_my_t*)lib->priv.w.p2;
+    SDL2_RWops_t *rw = RWNativeStart2(emu, (SDL2_RWops_t*)src);
+    void* ret = my->SMPEG_new_rwops(rw, info, f, audio);
+    if(!f) {
+        RWNativeEnd2(rw);
+    }
+    return ret;
+}
+
+#define CUSTOM_INIT \
+    lib->priv.w.p2 = getSMPEG2My(lib); \
+    lib->altmy = strdup("my2_");
+
+#define CUSTOM_FINI \
+    freeSMPEG2My(lib->priv.w.p2); \
+    free(lib->priv.w.p2); \
+
+#include "wrappedlib_init.h"
+
diff --git a/src/wrapped/wrappedsmpeg2_private.h b/src/wrapped/wrappedsmpeg2_private.h
new file mode 100755
index 00000000..e94bf481
--- /dev/null
+++ b/src/wrapped/wrappedsmpeg2_private.h
@@ -0,0 +1,29 @@
+#if defined(GO) && defined(GOM) && defined(GO2) && defined(DATA)
+
+GO(SMPEG_actualSpec,vFpp)
+GO(SMPEG_delete,vFp)
+GO(SMPEG_enableaudio,vFpi)
+GO(SMPEG_enablevideo,vFpi)
+GO(SMPEG_error,pFp)
+GO(SMPEG_getinfo,vFpp)
+GO(SMPEG_loop,vFpi)
+GO(SMPEG_new,pFppi)
+GO(SMPEG_new_data,pFpipi)
+GO(SMPEG_new_descr,pFipi)
+GOM(SMPEG_new_rwops,pFEppii)
+GO(SMPEG_pause,vFp)
+GO(SMPEG_play,vFp)
+GO(SMPEG_playAudio,iFppi)
+GO(SMPEG_playAudioSDL,vFppi)
+GO(SMPEG_renderFinal,vFp)
+GO(SMPEG_renderFrame,vFpi)
+GO(SMPEG_rewind,vFp)
+GO(SMPEG_seek,vFpi)
+GOM(SMPEG_setdisplay,vFEpppp)
+GO(SMPEG_setvolume,vFpi)
+GO(SMPEG_skip,vFpf)
+GO(SMPEG_status,iFp)
+GO(SMPEG_stop,vFp)
+GO(SMPEG_wantedSpec,iFpp)
+
+#endif
\ No newline at end of file