about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorrajdakin <rajdakin@gmail.com>2024-09-08 15:10:45 +0200
committerGitHub <noreply@github.com>2024-09-08 15:10:45 +0200
commit2e04ff93cabdbdcef060ce5e40f544f4dd6f93bb (patch)
treefcad53d794d67dc87eb19d75827240cd0a8ba407
parenta9f96b9d622a8d8462957d9d42b05d3574f6ba75 (diff)
downloadbox64-2e04ff93cabdbdcef060ce5e40f544f4dd6f93bb.tar.gz
box64-2e04ff93cabdbdcef060ce5e40f544f4dd6f93bb.zip
[WRAPPED] Fixed some libc wrapped functions (#1806)
* [WRAPPED] Fixed some libc wrapped functions

* [WRAPPED] Fixed static build, added back

* [WRAPPED] Fixed unlimited wrapping

* [WRAPPED] Forgot to update
-rw-r--r--src/wrapped/generated/functions_list.txt15
-rw-r--r--src/wrapped/generated/wrappedlibctypes.h9
-rw-r--r--src/wrapped/generated/wrapper.c13
-rw-r--r--src/wrapped/generated/wrapper.h6
-rw-r--r--src/wrapped/wrappedlibc.c101
-rw-r--r--src/wrapped/wrappedlibc_private.h24
6 files changed, 126 insertions, 42 deletions
diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt
index 8360d2cf..6f226189 100644
--- a/src/wrapped/generated/functions_list.txt
+++ b/src/wrapped/generated/functions_list.txt
@@ -394,7 +394,6 @@
 #() vFipu
 #() vFipL
 #() vFipp
-#() vFipA
 #() vFCCC
 #() vFWWW
 #() vFucc
@@ -1872,6 +1871,7 @@
 #() vFiiiuil
 #() vFiiilpi
 #() vFiiuilp
+#() vFiipupV
 #() vFiffiff
 #() vFiddidd
 #() vFilipli
@@ -3143,15 +3143,15 @@
 #!defined(NOALIGN) iFEiiip
 #!defined(NOALIGN) iFEipii
 #!defined(NOALIGN) iFEipiip
-#!defined(STATICBUILD) lFiV
+#!defined(STATICBUILD) lFiN
 #!defined(STATICBUILD) iFlip
 #!defined(STATICBUILD) iFLLi
 #!defined(STATICBUILD) iFLLii
 #!defined(STATICBUILD) WFpLLu
-#!defined(STATICBUILD) lFpLpV
 #!defined(STATICBUILD) iFEipup
 #!defined(STATICBUILD) iFEiipup
 #!defined(STATICBUILD) iFpipppL
+#!defined(STATICBUILD) lFpLpdddddd
 #() vFEv -> vFE
 #() iFEv -> iFE
 #() lFEv -> lFE
@@ -4230,12 +4230,15 @@ wrappedlibc:
   - execle
   - execlp
   - printf
+  - scanf
   - wprintf
+  - wscanf
 - iFpA:
   - __isoc99_vscanf
   - vprintf
   - vscanf
   - vwprintf
+  - vwscanf
 - iFSp:
   - _IO_file_stat
 - pFip:
@@ -4257,6 +4260,8 @@ wrappedlibc:
   - errx
   - syslog
 - vFipA:
+  - verr
+  - verrx
   - vsyslog
 - vFpii:
   - backtrace_symbols_fd
@@ -4326,6 +4331,7 @@ wrappedlibc:
   - vfprintf
   - vfscanf
   - vfwprintf
+  - vfwscanf
 - lFipV:
   - __wprintf_chk
 - lFppL:
@@ -4344,6 +4350,7 @@ wrappedlibc:
   - fopencookie
 - vFiipV:
   - __syslog_chk
+  - error
 - vFiipA:
   - __vsyslog_chk
 - vFpLLp:
@@ -4426,6 +4433,8 @@ wrappedlibc:
 - pFpppLp:
   - lfind
   - lsearch
+- vFiipupV:
+  - error_at_line
 - iFpLiLpp:
   - __vsnprintf_chk
 - iFpLiLpV:
diff --git a/src/wrapped/generated/wrappedlibctypes.h b/src/wrapped/generated/wrappedlibctypes.h
index 46c636db..1e5daf98 100644
--- a/src/wrapped/generated/wrappedlibctypes.h
+++ b/src/wrapped/generated/wrappedlibctypes.h
@@ -94,6 +94,7 @@ typedef int32_t (*iFpuppp_t)(void*, uint32_t, void*, void*, void*);
 typedef void* (*pFpLLiN_t)(void*, uintptr_t, uintptr_t, int32_t, ...);
 typedef void* (*pFppLLp_t)(void*, void*, uintptr_t, uintptr_t, void*);
 typedef void* (*pFpppLp_t)(void*, void*, void*, uintptr_t, void*);
+typedef void (*vFiipupV_t)(int32_t, int32_t, void*, uint32_t, void*, ...);
 typedef int32_t (*iFpLiLpp_t)(void*, uintptr_t, int32_t, uintptr_t, void*, void*);
 typedef int32_t (*iFpLiLpV_t)(void*, uintptr_t, int32_t, uintptr_t, void*, ...);
 typedef int32_t (*iFpppppp_t)(void*, void*, void*, void*, void*, void*);
@@ -161,11 +162,14 @@ typedef int32_t (*iFppipppp_t)(void*, void*, int32_t, void*, void*, void*, void*
 	GO(execle, iFpV_t) \
 	GO(execlp, iFpV_t) \
 	GO(printf, iFpV_t) \
+	GO(scanf, iFpV_t) \
 	GO(wprintf, iFpV_t) \
+	GO(wscanf, iFpV_t) \
 	GO(__isoc99_vscanf, iFpA_t) \
 	GO(vprintf, iFpA_t) \
 	GO(vscanf, iFpA_t) \
 	GO(vwprintf, iFpA_t) \
+	GO(vwscanf, iFpA_t) \
 	GO(_IO_file_stat, iFSp_t) \
 	GO(__sysv_signal, pFip_t) \
 	GO(bsd_signal, pFip_t) \
@@ -180,6 +184,8 @@ typedef int32_t (*iFppipppp_t)(void*, void*, int32_t, void*, void*, void*, void*
 	GO(err, vFipV_t) \
 	GO(errx, vFipV_t) \
 	GO(syslog, vFipV_t) \
+	GO(verr, vFipA_t) \
+	GO(verrx, vFipA_t) \
 	GO(vsyslog, vFipA_t) \
 	GO(backtrace_symbols_fd, vFpii_t) \
 	GO(_ITM_addUserCommitAction, vFpup_t) \
@@ -234,6 +240,7 @@ typedef int32_t (*iFppipppp_t)(void*, void*, int32_t, void*, void*, void*, void*
 	GO(vfprintf, iFSpA_t) \
 	GO(vfscanf, iFSpA_t) \
 	GO(vfwprintf, iFSpA_t) \
+	GO(vfwscanf, iFSpA_t) \
 	GO(__wprintf_chk, lFipV_t) \
 	GO(readlink, lFppL_t) \
 	GO(strlcat, LFppL_t) \
@@ -245,6 +252,7 @@ typedef int32_t (*iFppipppp_t)(void*, void*, int32_t, void*, void*, void*, void*
 	GO(tsearch, pFppp_t) \
 	GO(fopencookie, pFppV_t) \
 	GO(__syslog_chk, vFiipV_t) \
+	GO(error, vFiipV_t) \
 	GO(__vsyslog_chk, vFiipA_t) \
 	GO(qsort, vFpLLp_t) \
 	GO(makecontext, vFppiV_t) \
@@ -294,6 +302,7 @@ typedef int32_t (*iFppipppp_t)(void*, void*, int32_t, void*, void*, void*, void*
 	GO(bsearch, pFppLLp_t) \
 	GO(lfind, pFpppLp_t) \
 	GO(lsearch, pFpppLp_t) \
+	GO(error_at_line, vFiipupV_t) \
 	GO(__vsnprintf_chk, iFpLiLpp_t) \
 	GO(__snprintf_chk, iFpLiLpV_t) \
 	GO(__swprintf_chk, iFpLiLpV_t) \
diff --git a/src/wrapped/generated/wrapper.c b/src/wrapped/generated/wrapper.c
index d8af18f1..96186f9d 100644
--- a/src/wrapped/generated/wrapper.c
+++ b/src/wrapped/generated/wrapper.c
@@ -430,7 +430,6 @@ typedef void (*vFipi_t)(int32_t, void*, int32_t);
 typedef void (*vFipu_t)(int32_t, void*, uint32_t);
 typedef void (*vFipL_t)(int32_t, void*, uintptr_t);
 typedef void (*vFipp_t)(int32_t, void*, void*);
-typedef void (*vFipA_t)(int32_t, void*, void*);
 typedef void (*vFCCC_t)(uint8_t, uint8_t, uint8_t);
 typedef void (*vFWWW_t)(uint16_t, uint16_t, uint16_t);
 typedef void (*vFucc_t)(uint32_t, int8_t, int8_t);
@@ -1901,6 +1900,7 @@ typedef void (*vFiiiiii_t)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t)
 typedef void (*vFiiiuil_t)(int32_t, int32_t, int32_t, uint32_t, int32_t, intptr_t);
 typedef void (*vFiiilpi_t)(int32_t, int32_t, int32_t, intptr_t, void*, int32_t);
 typedef void (*vFiiuilp_t)(int32_t, int32_t, uint32_t, int32_t, intptr_t, void*);
+typedef void (*vFiipupV_t)(int32_t, int32_t, void*, uint32_t, void*, void*);
 typedef void (*vFiffiff_t)(int32_t, float, float, int32_t, float, float);
 typedef void (*vFiddidd_t)(int32_t, double, double, int32_t, double, double);
 typedef void (*vFilipli_t)(int32_t, intptr_t, int32_t, void*, intptr_t, int32_t);
@@ -3230,15 +3230,15 @@ typedef int32_t (*iFEipiip_t)(x64emu_t*, int32_t, void*, int32_t, int32_t, void*
 #endif
 
 #if !defined(STATICBUILD)
-typedef intptr_t (*lFiV_t)(int32_t, void*);
+typedef intptr_t (*lFiN_t)(int32_t, ...);
 typedef int32_t (*iFlip_t)(intptr_t, int32_t, void*);
 typedef int32_t (*iFLLi_t)(uintptr_t, uintptr_t, int32_t);
 typedef int32_t (*iFLLii_t)(uintptr_t, uintptr_t, int32_t, int32_t);
 typedef uint16_t (*WFpLLu_t)(void*, uintptr_t, uintptr_t, uint32_t);
-typedef intptr_t (*lFpLpV_t)(void*, uintptr_t, void*, void*);
 typedef int32_t (*iFEipup_t)(x64emu_t*, int32_t, void*, uint32_t, void*);
 typedef int32_t (*iFEiipup_t)(x64emu_t*, int32_t, int32_t, void*, uint32_t, void*);
 typedef int32_t (*iFpipppL_t)(void*, int32_t, void*, void*, void*, uintptr_t);
+typedef intptr_t (*lFpLpdddddd_t)(void*, uintptr_t, void*, double, double, double, double, double, double);
 #endif
 
 void vFE(x64emu_t *emu, uintptr_t fcn) { vFE_t fn = (vFE_t)fcn; fn(emu); }
@@ -3622,7 +3622,6 @@ void vFipi(x64emu_t *emu, uintptr_t fcn) { vFipi_t fn = (vFipi_t)fcn; fn((int32_
 void vFipu(x64emu_t *emu, uintptr_t fcn) { vFipu_t fn = (vFipu_t)fcn; fn((int32_t)R_RDI, (void*)R_RSI, (uint32_t)R_RDX); }
 void vFipL(x64emu_t *emu, uintptr_t fcn) { vFipL_t fn = (vFipL_t)fcn; fn((int32_t)R_RDI, (void*)R_RSI, (uintptr_t)R_RDX); }
 void vFipp(x64emu_t *emu, uintptr_t fcn) { vFipp_t fn = (vFipp_t)fcn; fn((int32_t)R_RDI, (void*)R_RSI, (void*)R_RDX); }
-void vFipA(x64emu_t *emu, uintptr_t fcn) { vFipA_t fn = (vFipA_t)fcn; fn((int32_t)R_RDI, (void*)R_RSI, (void*)R_RDX); }
 void vFCCC(x64emu_t *emu, uintptr_t fcn) { vFCCC_t fn = (vFCCC_t)fcn; fn((uint8_t)R_RDI, (uint8_t)R_RSI, (uint8_t)R_RDX); }
 void vFWWW(x64emu_t *emu, uintptr_t fcn) { vFWWW_t fn = (vFWWW_t)fcn; fn((uint16_t)R_RDI, (uint16_t)R_RSI, (uint16_t)R_RDX); }
 void vFucc(x64emu_t *emu, uintptr_t fcn) { vFucc_t fn = (vFucc_t)fcn; fn((uint32_t)R_RDI, (int8_t)R_RSI, (int8_t)R_RDX); }
@@ -5093,6 +5092,7 @@ void vFiiiiii(x64emu_t *emu, uintptr_t fcn) { vFiiiiii_t fn = (vFiiiiii_t)fcn; f
 void vFiiiuil(x64emu_t *emu, uintptr_t fcn) { vFiiiuil_t fn = (vFiiiuil_t)fcn; fn((int32_t)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX, (uint32_t)R_RCX, (int32_t)R_R8, (intptr_t)R_R9); }
 void vFiiilpi(x64emu_t *emu, uintptr_t fcn) { vFiiilpi_t fn = (vFiiilpi_t)fcn; fn((int32_t)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX, (intptr_t)R_RCX, (void*)R_R8, (int32_t)R_R9); }
 void vFiiuilp(x64emu_t *emu, uintptr_t fcn) { vFiiuilp_t fn = (vFiiuilp_t)fcn; fn((int32_t)R_RDI, (int32_t)R_RSI, (uint32_t)R_RDX, (int32_t)R_RCX, (intptr_t)R_R8, (void*)R_R9); }
+void vFiipupV(x64emu_t *emu, uintptr_t fcn) { vFiipupV_t fn = (vFiipupV_t)fcn; fn((int32_t)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (uint32_t)R_RCX, (void*)R_R8, (void*)(R_RSP + 8)); }
 void vFiffiff(x64emu_t *emu, uintptr_t fcn) { vFiffiff_t fn = (vFiffiff_t)fcn; fn((int32_t)R_RDI, emu->xmm[0].f[0], emu->xmm[1].f[0], (int32_t)R_RSI, emu->xmm[2].f[0], emu->xmm[3].f[0]); }
 void vFiddidd(x64emu_t *emu, uintptr_t fcn) { vFiddidd_t fn = (vFiddidd_t)fcn; fn((int32_t)R_RDI, emu->xmm[0].d[0], emu->xmm[1].d[0], (int32_t)R_RSI, emu->xmm[2].d[0], emu->xmm[3].d[0]); }
 void vFilipli(x64emu_t *emu, uintptr_t fcn) { vFilipli_t fn = (vFilipli_t)fcn; fn((int32_t)R_RDI, (intptr_t)R_RSI, (int32_t)R_RDX, (void*)R_RCX, (intptr_t)R_R8, (int32_t)R_R9); }
@@ -6422,15 +6422,15 @@ void iFEipiip(x64emu_t *emu, uintptr_t fcn) { iFEipiip_t fn = (iFEipiip_t)fcn; R
 #endif
 
 #if !defined(STATICBUILD)
-void lFiV(x64emu_t *emu, uintptr_t fcn) { lFiV_t fn = (lFiV_t)fcn; R_RAX=(intptr_t)fn((int32_t)R_RDI, (void*)(R_RSP + 8)); }
+void lFiN(x64emu_t *emu, uintptr_t fcn) { lFiN_t fn = (lFiN_t)fcn; R_RAX=(intptr_t)fn((int32_t)R_RDI, (void*)R_RSI); }
 void iFlip(x64emu_t *emu, uintptr_t fcn) { iFlip_t fn = (iFlip_t)fcn; R_RAX=(int32_t)fn((intptr_t)R_RDI, (int32_t)R_RSI, (void*)R_RDX); }
 void iFLLi(x64emu_t *emu, uintptr_t fcn) { iFLLi_t fn = (iFLLi_t)fcn; R_RAX=(int32_t)fn((uintptr_t)R_RDI, (uintptr_t)R_RSI, (int32_t)R_RDX); }
 void iFLLii(x64emu_t *emu, uintptr_t fcn) { iFLLii_t fn = (iFLLii_t)fcn; R_RAX=(int32_t)fn((uintptr_t)R_RDI, (uintptr_t)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX); }
 void WFpLLu(x64emu_t *emu, uintptr_t fcn) { WFpLLu_t fn = (WFpLLu_t)fcn; R_RAX=(unsigned short)fn((void*)R_RDI, (uintptr_t)R_RSI, (uintptr_t)R_RDX, (uint32_t)R_RCX); }
-void lFpLpV(x64emu_t *emu, uintptr_t fcn) { lFpLpV_t fn = (lFpLpV_t)fcn; R_RAX=(intptr_t)fn((void*)R_RDI, (uintptr_t)R_RSI, (void*)R_RDX, (void*)(R_RSP + 8)); }
 void iFEipup(x64emu_t *emu, uintptr_t fcn) { iFEipup_t fn = (iFEipup_t)fcn; R_RAX=(int32_t)fn(emu, (int32_t)R_RDI, (void*)R_RSI, (uint32_t)R_RDX, (void*)R_RCX); }
 void iFEiipup(x64emu_t *emu, uintptr_t fcn) { iFEiipup_t fn = (iFEiipup_t)fcn; R_RAX=(int32_t)fn(emu, (int32_t)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (uint32_t)R_RCX, (void*)R_R8); }
 void iFpipppL(x64emu_t *emu, uintptr_t fcn) { iFpipppL_t fn = (iFpipppL_t)fcn; R_RAX=(int32_t)fn((void*)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (uintptr_t)R_R9); }
+void lFpLpdddddd(x64emu_t *emu, uintptr_t fcn) { lFpLpdddddd_t fn = (lFpLpdddddd_t)fcn; R_RAX=(intptr_t)fn((void*)R_RDI, (uintptr_t)R_RSI, (void*)R_RDX, emu->xmm[0].d[0], emu->xmm[1].d[0], emu->xmm[2].d[0], emu->xmm[3].d[0], emu->xmm[4].d[0], emu->xmm[5].d[0]); }
 #endif
 
 void vFEv(x64emu_t *emu, uintptr_t fcn) { vFE_t fn = (vFE_t)fcn; fn(emu); }
@@ -8297,6 +8297,7 @@ int isSimpleWrapper(wrapper_t fun) {
 	if (fun == &iFLLii) return 1;
 	if (fun == &WFpLLu) return 1;
 	if (fun == &iFpipppL) return 1;
+	if (fun == &lFpLpdddddd) return 7;
 #endif
 	return 0;
 }
diff --git a/src/wrapped/generated/wrapper.h b/src/wrapped/generated/wrapper.h
index 8fef78c7..132d3b46 100644
--- a/src/wrapped/generated/wrapper.h
+++ b/src/wrapped/generated/wrapper.h
@@ -432,7 +432,6 @@ void vFipi(x64emu_t *emu, uintptr_t fnc);
 void vFipu(x64emu_t *emu, uintptr_t fnc);
 void vFipL(x64emu_t *emu, uintptr_t fnc);
 void vFipp(x64emu_t *emu, uintptr_t fnc);
-void vFipA(x64emu_t *emu, uintptr_t fnc);
 void vFCCC(x64emu_t *emu, uintptr_t fnc);
 void vFWWW(x64emu_t *emu, uintptr_t fnc);
 void vFucc(x64emu_t *emu, uintptr_t fnc);
@@ -1910,6 +1909,7 @@ void vFiiiiii(x64emu_t *emu, uintptr_t fnc);
 void vFiiiuil(x64emu_t *emu, uintptr_t fnc);
 void vFiiilpi(x64emu_t *emu, uintptr_t fnc);
 void vFiiuilp(x64emu_t *emu, uintptr_t fnc);
+void vFiipupV(x64emu_t *emu, uintptr_t fnc);
 void vFiffiff(x64emu_t *emu, uintptr_t fnc);
 void vFiddidd(x64emu_t *emu, uintptr_t fnc);
 void vFilipli(x64emu_t *emu, uintptr_t fnc);
@@ -3189,15 +3189,15 @@ void iFEipiip(x64emu_t *emu, uintptr_t fnc);
 #endif
 
 #if !defined(STATICBUILD)
-void lFiV(x64emu_t *emu, uintptr_t fnc);
+void lFiN(x64emu_t *emu, uintptr_t fnc);
 void iFlip(x64emu_t *emu, uintptr_t fnc);
 void iFLLi(x64emu_t *emu, uintptr_t fnc);
 void iFLLii(x64emu_t *emu, uintptr_t fnc);
 void WFpLLu(x64emu_t *emu, uintptr_t fnc);
-void lFpLpV(x64emu_t *emu, uintptr_t fnc);
 void iFEipup(x64emu_t *emu, uintptr_t fnc);
 void iFEiipup(x64emu_t *emu, uintptr_t fnc);
 void iFpipppL(x64emu_t *emu, uintptr_t fnc);
+void lFpLpdddddd(x64emu_t *emu, uintptr_t fnc);
 #endif
 
 void vFEv(x64emu_t *emu, uintptr_t fnc);
diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c
index 71b6ccbe..5333b90b 100644
--- a/src/wrapped/wrappedlibc.c
+++ b/src/wrapped/wrappedlibc.c
@@ -41,6 +41,7 @@
 #include <sys/resource.h>
 #include <sys/prctl.h>
 #include <sys/ptrace.h>
+#include <error.h>
 #undef LOG_INFO
 #undef LOG_DEBUG
 
@@ -902,6 +903,14 @@ EXPORT int my_vsprintf(x64emu_t* emu, void* buff,  void * fmt, x64_va_list_t b)
 }
 EXPORT int my___vsprintf_chk(x64emu_t* emu, void* buff, void * fmt, x64_va_list_t b) __attribute__((alias("my_vsprintf")));
 
+EXPORT int my_scanf(x64emu_t* emu, void* fmt, uint64_t* b)
+{
+    myStackAlignScanf(emu, (const char*)fmt, b, emu->scratch, 1);
+    PREPARE_VALIST;
+
+    return vscanf(fmt, VARARGS);
+}
+
 EXPORT int my_vfscanf(x64emu_t* emu, void* stream, void* fmt, x64_va_list_t b)
 {
     (void)emu;
@@ -928,6 +937,38 @@ EXPORT int my_vsscanf(x64emu_t* emu, void* stream, void* fmt, x64_va_list_t b)
 
 EXPORT int my___vsscanf(x64emu_t* emu, void* stream, void* fmt, void* b) __attribute__((alias("my_vsscanf")));
 
+EXPORT int my_vfwscanf(x64emu_t* emu, void* F, void* fmt, x64_va_list_t b)
+{
+    (void)emu;
+    #ifdef CONVERT_VALIST
+    CONVERT_VALIST(b);
+    #else
+    myStackAlignScanfWValist(emu, (const char*)fmt, emu->scratch, b);
+    PREPARE_VALIST;
+    #endif
+    return vfwscanf(F, fmt, VARARGS);
+}
+
+EXPORT int my_vwscanf(x64emu_t* emu, void* fmt, x64_va_list_t b)
+{
+    (void)emu;
+    #ifdef CONVERT_VALIST
+    CONVERT_VALIST(b);
+    #else
+    myStackAlignScanfWValist(emu, (const char*)fmt, emu->scratch, b);
+    PREPARE_VALIST;
+    #endif
+    return vwscanf(fmt, VARARGS);
+}
+
+EXPORT int my_wscanf(x64emu_t* emu, void* fmt, uint64_t* b)
+{
+    myStackAlignScanfW(emu, (const char*)fmt, b, emu->scratch, 1);
+    PREPARE_VALIST;
+
+    return vwscanf(fmt, VARARGS);
+}
+
 EXPORT int my_vswscanf(x64emu_t* emu, void* stream, void* fmt, x64_va_list_t b)
 {
     (void)emu;
@@ -1078,31 +1119,43 @@ EXPORT int my_swscanf(x64emu_t* emu, void* stream, void* fmt, uint64_t* b)
     return vswscanf(stream, fmt, VARARGS);
 }
 
-#if 0
-EXPORT void my_verr(x64emu_t* emu, int eval, void* fmt, void* b) {
-    #ifndef NOALIGN
-    myStackAlignW((const char*)fmt, (uint32_t*)b, emu->scratch);
+EXPORT void my_error(x64emu_t *emu, int status, int errnum, void* fmt, void* b) {
+    myStackAlign(emu, (const char*)fmt, b, emu->scratch, R_EAX, 3);
     PREPARE_VALIST;
-    void* f = verr;
-    ((vFipp_t)f)(eval, fmt, VARARGS);
-    #else
-    void* f = verr;
-    ((vFipp_t)f)(eval, fmt, (uint32_t*)b);
-    #endif
+    char buf[512];
+    vsnprintf(buf, 512, (const char*)fmt, VARARGS);
+    error(status, errnum, "%s", buf);
+}
+EXPORT void my_error_at_line(x64emu_t *emu, int status, int errnum, void* filename, uint32_t linenum, void* fmt, void* b) {
+    myStackAlign(emu, (const char*)fmt, b, emu->scratch, R_EAX, 5);
+    PREPARE_VALIST;
+    char buf[512];
+    vsnprintf(buf, 512, (const char*)fmt, VARARGS);
+    error_at_line(status, errnum, filename, linenum, "%s", buf);
 }
 
-EXPORT void my_vwarn(x64emu_t* emu, void* fmt, void* b) {
-    #ifndef NOALIGN
-    myStackAlignW((const char*)fmt, (uint32_t*)b, emu->scratch);
+EXPORT void my_verr(x64emu_t* emu, int eval, void* fmt, x64_va_list_t b) {
+    if (!fmt)
+        return err(eval, NULL);
+    #ifdef CONVERT_VALIST
+    (void)emu;
+    CONVERT_VALIST(b);
+    #else
+    myStackAlignValist(emu, (const char*)fmt, emu->scratch, b);
     PREPARE_VALIST;
-    void* f = vwarn;
-    ((vFpp_t)f)(fmt, VARARGS);
+    #endif
+    return verr(eval, fmt, VARARGS);
+}
+EXPORT void my_verrx(x64emu_t* emu, int eval, void* fmt, x64_va_list_t b) {
+    #ifdef CONVERT_VALIST
+    (void)emu;
+    CONVERT_VALIST(b);
     #else
-    void* f = vwarn;
-    ((vFpp_t)f)(fmt, (uint32_t*)b);
+    myStackAlignValist(emu, (const char*)fmt, emu->scratch, b);
+    PREPARE_VALIST;
     #endif
+    return verrx(eval, fmt, VARARGS);
 }
-#endif
 EXPORT void my_err(x64emu_t *emu, int eval, void* fmt, void* b) {
     myStackAlign(emu, (const char*)fmt, b, emu->scratch, R_EAX, 2);
     PREPARE_VALIST;
@@ -1113,6 +1166,18 @@ EXPORT void my_errx(x64emu_t *emu, int eval, void* fmt, void* b) {
     PREPARE_VALIST;
     verrx(eval, (const char*)fmt, VARARGS);
 }
+EXPORT void my_vwarn(x64emu_t* emu, void* fmt, x64_va_list_t b) {
+    if (!fmt)
+        return warn(NULL);
+    #ifdef CONVERT_VALIST
+    (void)emu;
+    CONVERT_VALIST(b);
+    #else
+    myStackAlignValist(emu, (const char*)fmt, emu->scratch, b);
+    PREPARE_VALIST;
+    #endif
+    return vwarn(fmt, VARARGS);
+}
 EXPORT void my_warn(x64emu_t *emu, void* fmt, void* b) {
     myStackAlign(emu, (const char*)fmt, b, emu->scratch, R_EAX, 1);
     PREPARE_VALIST;
diff --git a/src/wrapped/wrappedlibc_private.h b/src/wrapped/wrappedlibc_private.h
index 869827d1..39cd116b 100644
--- a/src/wrapped/wrappedlibc_private.h
+++ b/src/wrapped/wrappedlibc_private.h
@@ -307,8 +307,8 @@ GOW(erand48_r, iFppp)
 GOM(err, vFEipV)
 //DATAB(errno, 
 GO(__errno_location, pFv)
-GOW(error, vFiipV)
-//GOWM(error_at_line, vFiipupV)
+GOWM(error, vFiipV)
+GOWM(error_at_line, vFiipupV)
 //DATAB(error_message_count, 4)
 //DATAB(error_one_per_line, 4)
 //DATAM(error_print_progname, 8)
@@ -1702,7 +1702,7 @@ GOWM(scandir, iFEpppp)
 GOWM(scandir64, iFEpppp)
 GOWM(scandirat, iFipppp)
 //GOM(scandirat64, iFipppp)
-GO(scanf, iFpV)
+GOM(scanf, iFpV)
 GO(__sched_cpualloc, pFL)
 GO(__sched_cpucount, iFLp)
 GO(__sched_cpufree, vFp)
@@ -1945,7 +1945,7 @@ GO(strerror_r, pFipL)
 //GO(strfmon, lFpLpV)
 //GO(__strfmon_l, 
 #else
-GO(strfmon, lFpLpV)
+GO(strfmon, lFpLpdddddd)        // should be V, but only double are allowed...
 //GO(__strfmon_l, 
 #endif
 GOW(strfmon_l, lFpLppdddddd)    // should be V, but only double are allowed...
@@ -2237,7 +2237,7 @@ GOW(ulckpwdf, iFv)
 #ifdef STATICBUILD
 //GOW(ulimit, lFiV)
 #else
-GOW(ulimit, lFiV)
+GOW(ulimit, lFiN)
 #endif
 GOW(umask, uFu)
 GOW(umount, iFp)
@@ -2273,8 +2273,8 @@ GOWM(vasprintf, iFEppA)
 GOM(__vasprintf_chk, iFEpipp)
 GOM(vdprintf, iFEipA)
 GOM(__vdprintf_chk, iFEiipA)
-GO(verr, vFipA)
-GO(verrx, vFipA)
+GOM(verr, vFEipA)
+GOM(verrx, vFEipA)
 GOW(versionsort, iFpp)
 GOW(versionsort64, iFpp)
 //GO(__vfork, 
@@ -2285,7 +2285,7 @@ GOM(__vfprintf_chk, iFEpvpp)
 GOWM(vfscanf, iFESpA)
 GOWM(vfwprintf, iFESpA)
 GOM(__vfwprintf_chk, iFEpipA)
-GOW(vfwscanf, iFSpA)
+GOWM(vfwscanf, iFSpA)
 GO(vhangup, iFv)
 //GO(vlimit, 
 GO(vmsplice, lFipLu)
@@ -2309,7 +2309,7 @@ GO(vwarn, vFpA)
 GO(vwarnx, vFpA)
 GOM(vwprintf, iFEpA)
 //GO(__vwprintf_chk, 
-GO(vwscanf, iFpA)
+GOM(vwscanf, iFpA)
 GOW(__wait, iFp)
 GOW(wait, iFp)
 GOW(wait3, iFpip)
@@ -2441,7 +2441,7 @@ GOW(__write, lFipL)
 GO(write, lFipL)
 //GO(__write_nocancel, 
 GOW(writev, lFipi)
-GO(wscanf, iFpV)
+GOM(wscanf, iFEpV)
 //GO(__wuflow, 
 //GO(__wunderflow, 
 //GO(xdecrypt, 
@@ -2633,8 +2633,8 @@ GOM(__libc_init, vFEpppp)
 GO(__errno, pFv)
 #else
 // Those symbols don't exist in non-Android builds
-//GOM(__libc_init,
-//GO(__errno,
+//GOM(__libc_init, 
+//GO(__errno, 
 #endif
 #ifdef STATICBUILD
 GO(dummy_pFLp, pFLp)