1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
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[64];
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));
}
|