diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-06-05 15:03:37 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-06-05 15:03:37 +0200 |
| commit | 3bdcae10c8e0ed7b958137124585b0ff594a21fc (patch) | |
| tree | 03073bc8d2d4c27d446c16924122e1982573fd55 /src | |
| parent | 681df1604dd27688fdcc07c7fd1640b3f1bd8a54 (diff) | |
| download | box64-3bdcae10c8e0ed7b958137124585b0ff594a21fc.tar.gz box64-3bdcae10c8e0ed7b958137124585b0ff594a21fc.zip | |
Added a few more wrapped function and improved getopt handling
Diffstat (limited to 'src')
| -rwxr-xr-x | src/include/globalsymbols.h | 3 | ||||
| -rwxr-xr-x | src/librarian/globalsymbols.c | 13 | ||||
| -rw-r--r-- | src/wrapped/generated/functions_list.txt | 2 | ||||
| -rw-r--r-- | src/wrapped/generated/wrappedlibctypes.h | 2 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibc.c | 40 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibc_private.h | 22 |
6 files changed, 58 insertions, 24 deletions
diff --git a/src/include/globalsymbols.h b/src/include/globalsymbols.h index e2bd19d3..8af78d05 100755 --- a/src/include/globalsymbols.h +++ b/src/include/globalsymbols.h @@ -11,4 +11,7 @@ // NCurse / TInfo void my_checkGlobalTInfo(); +// getopt +void my_checkGlobalOpt(); + #endif //_GLOBAL_SYMBOLS_H_ \ No newline at end of file diff --git a/src/librarian/globalsymbols.c b/src/librarian/globalsymbols.c index a6dc73c0..a5ca89c1 100755 --- a/src/librarian/globalsymbols.c +++ b/src/librarian/globalsymbols.c @@ -87,4 +87,17 @@ void my_checkGlobalTInfo() GLOB(PC) GLOB(ospeed) GLOB(ttytype) +} + +// **************** getopts **************** +EXPORT char *optarg; +EXPORT int optind, opterr, optopt; + +void my_checkGlobalOpt() +{ + uintptr_t globoffs, globend; + GLOB(optarg); + GLOB(optind); + GLOB(opterr); + GLOB(optopt); } \ No newline at end of file diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt index a86bb76c..5caac75b 100644 --- a/src/wrapped/generated/functions_list.txt +++ b/src/wrapped/generated/functions_list.txt @@ -1473,8 +1473,10 @@ wrappedlibc: - vfprintf - vsscanf - iFppV: + - __asprintf - __isoc99_fscanf - __isoc99_sscanf + - asprintf - fprintf - fscanf - fwprintf diff --git a/src/wrapped/generated/wrappedlibctypes.h b/src/wrapped/generated/wrappedlibctypes.h index e5bc173e..f5a6b7d6 100644 --- a/src/wrapped/generated/wrappedlibctypes.h +++ b/src/wrapped/generated/wrappedlibctypes.h @@ -124,8 +124,10 @@ typedef int64_t (*iFpippppp_t)(void*, int64_t, void*, void*, void*, void*, void* GO(vasprintf, iFppp_t) \ GO(vfprintf, iFppp_t) \ GO(vsscanf, iFppp_t) \ + GO(__asprintf, iFppV_t) \ GO(__isoc99_fscanf, iFppV_t) \ GO(__isoc99_sscanf, iFppV_t) \ + GO(asprintf, iFppV_t) \ GO(fprintf, iFppV_t) \ GO(fscanf, iFppV_t) \ GO(fwprintf, iFppV_t) \ diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c index 3cd8a75b..270066ad 100755 --- a/src/wrapped/wrappedlibc.c +++ b/src/wrapped/wrappedlibc.c @@ -36,6 +36,7 @@ #include <spawn.h> #include <fts.h> #include <syslog.h> +#include <getopt.h> #undef LOG_INFO #undef LOG_DEBUG @@ -57,7 +58,7 @@ #include "auxval.h" #include "elfloader.h" #include "bridge.h" - +#include "globalsymbols.h" #define LIBNAME libc const char* libcName = "libc.so.6"; @@ -674,20 +675,12 @@ EXPORT int my___sprintf_chk(x64emu_t* emu, void* buff, int flag, size_t l, void return vsprintf(buff, (const char*)fmt, VARARGS); } -#if 0 -EXPORT int my_asprintf(x64emu_t* emu, void** buff, void * fmt, void * b, va_list V) { - #ifndef NOALIGN - // need to align on arm - myStackAlign((const char*)fmt, b, emu->scratch); +EXPORT int my_asprintf(x64emu_t* emu, void** buff, void * fmt, uint64_t * b) { + myStackAlign(emu, (const char*)fmt, b, emu->scratch, R_EAX, 2); PREPARE_VALIST; - void* f = vasprintf; - return ((iFppp_t)f)(buff, fmt, VARARGS); - #else - return vasprintf((char**)buff, (char*)fmt, V); - #endif + return vasprintf((char**)buff, (char*)fmt, VARARGS); } -EXPORT int my___asprintf(x64emu_t* emu, void** buff, void * fmt, void * b, va_list V) __attribute__((alias("my_asprintf"))); -#endif +EXPORT int my___asprintf(x64emu_t* emu, void** buff, void * fmt, uint64_t * b) __attribute__((alias("my_asprintf"))); EXPORT int my_vasprintf(x64emu_t* emu, char** buff, void* fmt, x64_va_list_t b) { (void)emu; @@ -2061,6 +2054,27 @@ EXPORT int my_mprotect(x64emu_t* emu, void *addr, unsigned long len, int prot) return ret; } +EXPORT int my_getopt(int argc, char* const argv[], const char *optstring) +{ + int ret = getopt(argc, argv, optstring); + my_checkGlobalOpt(); + return ret; +} + +EXPORT int my_getopt_long(int argc, char* const argv[], const char* optstring, const struct option *longopts, int *longindex) +{ + int ret = getopt_long(argc, argv, optstring, longopts, longindex); + my_checkGlobalOpt(); + return ret; +} + +EXPORT int my_getopt_long_only(int argc, char* const argv[], const char* optstring, const struct option *longopts, int *longindex) +{ + int ret = getopt_long_only(argc, argv, optstring, longopts, longindex); + my_checkGlobalOpt(); + return ret; +} + #if 0 typedef struct my_cookie_s { uintptr_t r, w, s, c; diff --git a/src/wrapped/wrappedlibc_private.h b/src/wrapped/wrappedlibc_private.h index 607b5a5a..ceb3e1ab 100755 --- a/src/wrapped/wrappedlibc_private.h +++ b/src/wrapped/wrappedlibc_private.h @@ -54,8 +54,8 @@ GOW(alphasort64, iFpp) //GOW(argz_stringify, GO(asctime, pFp) GOW(asctime_r, pFpp) -//GO(__asprintf, -//GOW(asprintf, +GOM(__asprintf, iFEppV) +GOM(asprintf, iFEppV) //Weak //GO(__asprintf_chk, //GO(__assert, GO(__assert_fail, vFppup) @@ -554,9 +554,9 @@ GO(getnameinfo, iFpupLpLi) //GO(getnetname, GOW(get_nprocs, iFv) GOW(get_nprocs_conf, iFv) -GO(getopt, iFipp) -GO(getopt_long, iFipppp) -GO(getopt_long_only, iFipppp) +GOM(getopt, iFipp) +GOM(getopt_long, iFipppp) +GOM(getopt_long_only, iFipppp) GO(__getpagesize, iFv) GOW(getpagesize, iFv) //GO(getpass, @@ -1284,10 +1284,10 @@ GO(openlog, vFpii) //GOW(open_memstream, //GO(__open_nocancel, //GO(open_wmemstream, -//DATAB(optarg, -//DATA(opterr, -//DATA(optind, -//DATA(optopt, +DATA(optarg, sizeof(void*)) +DATA(opterr, sizeof(int)) +DATA(optind, sizeof(int)) +DATA(optopt, sizeof(int)) //GO(__overflow, //GO(parse_printf_format, //GO(passwd2des, @@ -1575,12 +1575,12 @@ GOW(sched_get_priority_max, iFi) GO(__sched_get_priority_min, iFi) GOW(sched_get_priority_min, iFi) //GO(__sched_getscheduler, -//GOW(sched_getscheduler, +GOW(sched_getscheduler, iFp) //GOW(sched_rr_get_interval, GO(sched_setaffinity, iFLLp) //GOW(sched_setparam, //GO(__sched_setscheduler, -//GOW(sched_setscheduler, +GOW(sched_setscheduler, iFpip) GO(__sched_yield, iFv) GOW(sched_yield, iFv) GO2(__secure_getenv, pFp, getenv) // not always present |