about summary refs log tree commit diff stats
path: root/src/librarian
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-10-19 10:38:11 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-10-19 10:38:11 +0200
commita5797da100bebf3941cecfb0fe0ed094f963f108 (patch)
tree03a99ab13052e6c632f8a36951e2de587f256a99 /src/librarian
parent0821e6acc230b4cc9806ce29f4def74c76465394 (diff)
downloadbox64-a5797da100bebf3941cecfb0fe0ed094f963f108.tar.gz
box64-a5797da100bebf3941cecfb0fe0ed094f963f108.zip
[BOX32][WRAPPER] Added some more libc wrapped function, and 32bits globalsymbol infrastructure
Diffstat (limited to 'src/librarian')
-rw-r--r--src/librarian/globalsymbols32.c108
1 files changed, 108 insertions, 0 deletions
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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <dlfcn.h>
+
+#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));
+}