From a5797da100bebf3941cecfb0fe0ed094f963f108 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sat, 19 Oct 2024 10:38:11 +0200 Subject: [BOX32][WRAPPER] Added some more libc wrapped function, and 32bits globalsymbol infrastructure --- src/librarian/globalsymbols32.c | 108 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 src/librarian/globalsymbols32.c (limited to 'src/librarian') diff --git a/src/librarian/globalsymbols32.c b/src/librarian/globalsymbols32.c new file mode 100644 index 00000000..b4c83682 --- /dev/null +++ b/src/librarian/globalsymbols32.c @@ -0,0 +1,108 @@ +#define _GNU_SOURCE +#include +#include +#include +#include + +#include "wrappedlibs.h" + +#include "debug.h" +#include "wrapper32.h" +#include "bridge.h" +#include "callback.h" +#include "box32context.h" +#include "librarian.h" +#include "library.h" + +// workaround for Globals symbols + +#define GLOB(A, B, C) \ + if (GetGlobalNoWeakSymbolStartEnd(my_context->maplib, #A, &globoffs, &globend, -1, NULL, 0, NULL)) { \ + printf_log(LOG_DEBUG, "Global " #A " workaround, @%p <- %p\n", (void*)globoffs, &A); \ + memcpy((void*)globoffs, &A, C); \ + } \ + if (B && GetGlobalNoWeakSymbolStartEnd(my_context->maplib, #A, &globoffs, &globend, 2, B, 1, NULL)) { \ + printf_log(LOG_DEBUG, "Global " #A " workaround, @%p <- %p\n", (void*)globoffs, &A); \ + memcpy((void*)globoffs, &A, C); \ + } + +#define TOGLOB(A, B, C) \ + if (GetGlobalNoWeakSymbolStartEnd(my_context->maplib, #A, &globoffs, &globend, -1, NULL, 0, NULL)) { \ + printf_log(LOG_DEBUG, "Global " #A " workaround, @%p -> %p\n", (void*)globoffs, &A); \ + memcpy(&A, (void*)globoffs, C); \ + } \ + if (B && GetGlobalNoWeakSymbolStartEnd(my_context->maplib, #A, &globoffs, &globend, 2, B, 1, NULL)) { \ + printf_log(LOG_DEBUG, "Global " #A " workaround, @%p -> %p\n", (void*)globoffs, &A); \ + memcpy(&A, (void*)globoffs, C); \ + } + + +// **************** NCurses **************** +extern int COLS; +extern int LINES; +extern int TABSIZE; +extern void* curscr; +extern void* newscr; +extern void* stdscr; +extern void* acs_map[128]; +extern void* UP; +extern void* BC; +extern uint8_t PC; +extern uint16_t ospeed; +extern void* ttytype; + +void my32_checkGlobalTInfo() +{ + uintptr_t globoffs, globend; + GLOB(COLS, NULL, sizeof(int)) + GLOB(LINES, NULL, sizeof(int)) + GLOB(TABSIZE, NULL, sizeof(int)) + GLOB(curscr, NULL, sizeof(ptr_t)) + GLOB(newscr, NULL, sizeof(ptr_t)) + GLOB(stdscr, NULL, sizeof(ptr_t)) + GLOB(acs_map, NULL, sizeof(ptr_t)) + GLOB(UP, NULL, sizeof(ptr_t)) + GLOB(BC, NULL, sizeof(ptr_t)) + GLOB(PC, NULL, sizeof(uint8_t)) + GLOB(ospeed, NULL, sizeof(uint16_t)) + GLOB(ttytype, NULL, sizeof(ptr_t)) +} + +void my32_updateGlobalTInfo() +{ + uintptr_t globoffs, globend; + TOGLOB(COLS, NULL, sizeof(int)) + TOGLOB(LINES, NULL, sizeof(int)) + TOGLOB(TABSIZE, NULL, sizeof(int)) + TOGLOB(curscr, NULL, sizeof(ptr_t)) + TOGLOB(newscr, NULL, sizeof(ptr_t)) + TOGLOB(stdscr, NULL, sizeof(ptr_t)) + TOGLOB(acs_map, NULL, sizeof(ptr_t)) + TOGLOB(UP, NULL, sizeof(ptr_t)) + TOGLOB(BC, NULL, sizeof(ptr_t)) + TOGLOB(PC, NULL, sizeof(uint8_t)) + TOGLOB(ospeed, NULL, sizeof(uint16_t)) + TOGLOB(ttytype, NULL, sizeof(ptr_t)) +} + +// **************** getopts **************** +extern char *optarg; +extern int optind, opterr, optopt; + +void my32_updateGlobalOpt() +{ + uintptr_t globoffs, globend; + TOGLOB(optarg, "GLIBC_2.2.5", sizeof(ptr_t)); + TOGLOB(optind, "GLIBC_2.2.5", sizeof(int)); + TOGLOB(opterr, "GLIBC_2.2.5", sizeof(int)); + TOGLOB(optopt, "GLIBC_2.2.5", sizeof(int)); +} + +void my32_checkGlobalOpt() +{ + uintptr_t globoffs, globend; + GLOB(optarg, "GLIBC_2.2.5", sizeof(ptr_t)); + GLOB(optind, "GLIBC_2.2.5", sizeof(int)); + GLOB(opterr, "GLIBC_2.2.5", sizeof(int)); + GLOB(optopt, "GLIBC_2.2.5", sizeof(int)); +} -- cgit 1.4.1