Skip to content

Commit 72807b6

Browse files
authored
[WRAPPER] Wrapped libc argp_parse (#3423)
* [WRAPPER] Wrapped libc argp_parse * workaround termux * and of course android
1 parent 05b37ab commit 72807b6

File tree

7 files changed

+55
-1
lines changed

7 files changed

+55
-1
lines changed

src/emu/x64printer.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5287,6 +5287,8 @@ void x64Print(x64emu_t* emu, char* buff, size_t buffsz, const char* func, int ti
52875287
snprintf(buff, buffsz, "%04d|%p: Calling %s(%" PRIp ", %" PRIp ", %" PRIp ", %" PRIp ", %" PRIp ", %" PRIp ", %" PRIp ")", tid, *(void**)(R_RSP), func, (void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9, *(void**)(R_RSP + 8));
52885288
} else if (w == iFElppppp) {
52895289
snprintf(buff, buffsz, "%04d|%p: Calling %s(%" PRIi64 ", %" PRIp ", %" PRIp ", %" PRIp ", %" PRIp ", %" PRIp ")", tid, *(void**)(R_RSP), func, (intptr_t)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9);
5290+
} else if (w == iFEpipupp) {
5291+
snprintf(buff, buffsz, "%04d|%p: Calling %s(%" PRIp ", %" PRIi32 ", %" PRIp ", %" PRIu32 ", %" PRIp ", %" PRIp ")", tid, *(void**)(R_RSP), func, (void*)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (uint32_t)R_RCX, (void*)R_R8, (void*)R_R9);
52905292
} else if (w == iFEpupppp) {
52915293
snprintf(buff, buffsz, "%04d|%p: Calling %s(%" PRIp ", %" PRIu32 ", %" PRIp ", %" PRIp ", %" PRIp ", %" PRIp ")", tid, *(void**)(R_RSP), func, (void*)R_RDI, (uint32_t)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9);
52925294
} else if (w == iFEpUuppp) {

src/wrapped/generated/functions_list.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2876,6 +2876,7 @@
28762876
#() vFppppppp
28772877
#() cFppppppp
28782878
#() iFElppppp
2879+
#() iFEpipupp
28792880
#() iFEpupppp
28802881
#() iFEpUuppp
28812882
#() iFEpLiLpp
@@ -5359,6 +5360,8 @@ wrappedlibc:
53595360
- lsearch
53605361
- vFiipupV:
53615362
- error_at_line
5363+
- iFpipupp:
5364+
- argp_parse
53625365
- iFpipppL:
53635366
- __sysctl
53645367
- sysctl

src/wrapped/generated/wrappedlibctypes.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ typedef void* (*pFpLLiN_t)(void*, uintptr_t, uintptr_t, int32_t, ...);
109109
typedef void* (*pFppLLp_t)(void*, void*, uintptr_t, uintptr_t, void*);
110110
typedef void* (*pFpppLp_t)(void*, void*, void*, uintptr_t, void*);
111111
typedef void (*vFiipupV_t)(int32_t, int32_t, void*, uint32_t, void*, ...);
112+
typedef int32_t (*iFpipupp_t)(void*, int32_t, void*, uint32_t, void*, void*);
112113
typedef int32_t (*iFpipppL_t)(void*, int32_t, void*, void*, void*, uintptr_t);
113114
typedef int32_t (*iFpLiLpp_t)(void*, uintptr_t, int32_t, uintptr_t, void*, void*);
114115
typedef int32_t (*iFpLiLpV_t)(void*, uintptr_t, int32_t, uintptr_t, void*, ...);
@@ -345,6 +346,7 @@ typedef int32_t (*iFppipppp_t)(void*, void*, int32_t, void*, void*, void*, void*
345346
GO(lfind, pFpppLp_t) \
346347
GO(lsearch, pFpppLp_t) \
347348
GO(error_at_line, vFiipupV_t) \
349+
GO(argp_parse, iFpipupp_t) \
348350
GO(__sysctl, iFpipppL_t) \
349351
GO(sysctl, iFpipppL_t) \
350352
GO(__vsnprintf_chk, iFpLiLpp_t) \

src/wrapped/generated/wrapper.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2903,6 +2903,7 @@ typedef void (*vFppppppL_t)(void*, void*, void*, void*, void*, void*, uintptr_t)
29032903
typedef void (*vFppppppp_t)(void*, void*, void*, void*, void*, void*, void*);
29042904
typedef int8_t (*cFppppppp_t)(void*, void*, void*, void*, void*, void*, void*);
29052905
typedef int32_t (*iFElppppp_t)(x64emu_t*, intptr_t, void*, void*, void*, void*, void*);
2906+
typedef int32_t (*iFEpipupp_t)(x64emu_t*, void*, int32_t, void*, uint32_t, void*, void*);
29062907
typedef int32_t (*iFEpupppp_t)(x64emu_t*, void*, uint32_t, void*, void*, void*, void*);
29072908
typedef int32_t (*iFEpUuppp_t)(x64emu_t*, void*, uint64_t, uint32_t, void*, void*, void*);
29082909
typedef int32_t (*iFEpLiLpp_t)(x64emu_t*, void*, uintptr_t, int32_t, uintptr_t, void*, void*);
@@ -6833,6 +6834,7 @@ void vFppppppL(x64emu_t *emu, uintptr_t fcn) { vFppppppL_t fn = (vFppppppL_t)fcn
68336834
void vFppppppp(x64emu_t *emu, uintptr_t fcn) { vFppppppp_t fn = (vFppppppp_t)fcn; fn((void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9, *(void**)(R_RSP + 8)); }
68346835
void cFppppppp(x64emu_t *emu, uintptr_t fcn) { cFppppppp_t fn = (cFppppppp_t)fcn; R_RAX=(uint8_t)fn((void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9, *(void**)(R_RSP + 8)); }
68356836
void iFElppppp(x64emu_t *emu, uintptr_t fcn) { iFElppppp_t fn = (iFElppppp_t)fcn; R_RAX=(uint32_t)fn(emu, (intptr_t)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9); }
6837+
void iFEpipupp(x64emu_t *emu, uintptr_t fcn) { iFEpipupp_t fn = (iFEpipupp_t)fcn; R_RAX=(uint32_t)fn(emu, (void*)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (uint32_t)R_RCX, (void*)R_R8, (void*)R_R9); }
68366838
void iFEpupppp(x64emu_t *emu, uintptr_t fcn) { iFEpupppp_t fn = (iFEpupppp_t)fcn; R_RAX=(uint32_t)fn(emu, (void*)R_RDI, (uint32_t)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9); }
68376839
void iFEpUuppp(x64emu_t *emu, uintptr_t fcn) { iFEpUuppp_t fn = (iFEpUuppp_t)fcn; R_RAX=(uint32_t)fn(emu, (void*)R_RDI, (uint64_t)R_RSI, (uint32_t)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9); }
68386840
void iFEpLiLpp(x64emu_t *emu, uintptr_t fcn) { iFEpLiLpp_t fn = (iFEpLiLpp_t)fcn; R_RAX=(uint32_t)fn(emu, (void*)R_RDI, (uintptr_t)R_RSI, (int32_t)R_RDX, (uintptr_t)R_RCX, (void*)R_R8, (void*)R_R9); }

src/wrapped/generated/wrapper.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2913,6 +2913,7 @@ void vFppppppL(x64emu_t *emu, uintptr_t fnc);
29132913
void vFppppppp(x64emu_t *emu, uintptr_t fnc);
29142914
void cFppppppp(x64emu_t *emu, uintptr_t fnc);
29152915
void iFElppppp(x64emu_t *emu, uintptr_t fnc);
2916+
void iFEpipupp(x64emu_t *emu, uintptr_t fnc);
29162917
void iFEpupppp(x64emu_t *emu, uintptr_t fnc);
29172918
void iFEpUuppp(x64emu_t *emu, uintptr_t fnc);
29182919
void iFEpLiLpp(x64emu_t *emu, uintptr_t fnc);

src/wrapped/wrappedlibc.c

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
#define _LARGEFILE_SOURCE 1
22
#define _FILE_OFFSET_BITS 64
33
#define _GNU_SOURCE /* See feature_test_macros(7) */
4+
#if !defined(TERMUX) && !defined(ANDROID)
5+
#include <argp.h>
6+
#endif
47
#include <stdlib.h>
58
#include <stdio.h>
69
#include <stddef.h>
@@ -450,8 +453,49 @@ static void* findprintf_typeFct(void* fct)
450453
return NULL;
451454
}
452455

456+
// printf_type
457+
#define GO(A) \
458+
static uintptr_t my_argp_parser_fct_##A = 0; \
459+
static int my_argp_parser_##A(int a, void* b, void* c) \
460+
{ \
461+
return RunFunctionFmt(my_argp_parser_fct_##A, "ipp", a, b, c); \
462+
}
463+
SUPER()
464+
#undef GO
465+
static void* find_argp_parser_Fct(void* fct)
466+
{
467+
if (!fct) return NULL;
468+
void* p;
469+
if ((p = GetNativeFnc((uintptr_t)fct))) return p;
470+
#define GO(A) \
471+
if (my_argp_parser_fct_##A == (uintptr_t)fct) return my_argp_parser_##A;
472+
SUPER()
473+
#undef GO
474+
#define GO(A) \
475+
if (my_argp_parser_fct_##A == 0) { \
476+
my_argp_parser_fct_##A = (uintptr_t)fct; \
477+
return my_argp_parser_##A; \
478+
}
479+
SUPER()
480+
#undef GO
481+
printf_log(LOG_NONE, "Warning, no more slot for libc argp_parser callback\n");
482+
return NULL;
483+
}
484+
453485
#undef SUPER
454486

487+
EXPORT int my_argp_parse(x64emu_t* emu, struct argp* argp, int argc, char** argv, int flags, int* index, void* input)
488+
{
489+
#if !defined(TERMUX) && !defined(ANDROID)
490+
void* fct = (void*)argp->parser;
491+
if (fct) argp->parser = find_argp_parser_Fct(fct);
492+
return argp_parse(argp, argc, argv, flags, index, input);
493+
#else
494+
printf_log(LOG_NONE, "Warning: unsupported argp_parse called, expecting failure\n");
495+
return -1;
496+
#endif
497+
}
498+
455499
// some my_XXX declare and defines
456500
int32_t my___libc_start_main(x64emu_t* emu, int (*main) (int, char * *, char * *),
457501
int argc, char * * ubp_av, void (*init) (void), void (*fini) (void),

src/wrapped/wrappedlibc_private.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ GOW(alphasort64, iFpp)
2626
//GOWM(argp_error, vFppV)
2727
//GOWM(argp_failure, vFpiipV)
2828
//GOWM(argp_help, vFpSup)
29-
//GOWM(argp_parse, iFpipupp)
29+
GOWM(argp_parse, iFEpipupp)
3030
//DATAB(argp_program_bug_address, 8)
3131
//DATAB(argp_program_version, 8)
3232
//DATAM(argp_program_version_hook, 8)

0 commit comments

Comments
 (0)