diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-03-07 14:14:07 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-03-07 14:14:07 +0100 |
| commit | 622baec9529bb261cd250c2c2b9768b75ee0530f (patch) | |
| tree | 45c313608b2e02fbe570a92b4113a855de25be27 /src | |
| parent | a326c821580ed2cd6665312a6d78696c5f6afcca (diff) | |
| download | box64-622baec9529bb261cd250c2c2b9768b75ee0530f.tar.gz box64-622baec9529bb261cd250c2c2b9768b75ee0530f.zip | |
Fix some special case on mmap64 wrapping
Diffstat (limited to 'src')
| -rw-r--r-- | src/custommem.c | 5 | ||||
| -rwxr-xr-x | src/librarian/librarian.c | 1 | ||||
| -rwxr-xr-x | src/librarian/library.c | 1 | ||||
| -rwxr-xr-x | src/libtools/signals.c | 7 | ||||
| -rwxr-xr-x | src/tools/box64stack.c | 1 |
5 files changed, 7 insertions, 8 deletions
diff --git a/src/custommem.c b/src/custommem.c index b653e78b..843532bb 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -940,6 +940,7 @@ void allocProtection(uintptr_t addr, size_t size, uint32_t prot) void loadProtectionFromMap() { +printf_log(LOG_INFO, "loadProtectionFromMap(), mapclean=%d\n", box64_mapclean); if(box64_mapclean) return; char buf[500]; @@ -1091,7 +1092,7 @@ void* find47bitBlock(size_t size) void* find47bitBlockNearHint(void* hint, size_t size) { // slow iterative search... Would need something better one day - uintptr_t addr = (uintptr_t)hint; + uintptr_t addr = (uintptr_t)(hint?hint:LOWEST); do { addr = nextFree(addr, 0x10000); uintptr_t sz = maxFree(addr, size); @@ -1106,7 +1107,7 @@ void* find47bitBlockNearHint(void* hint, size_t size) void* findBlockNearHint(void* hint, size_t size) { // slow iterative search... Would need something better one day - uintptr_t addr = (uintptr_t)hint; + uintptr_t addr = (uintptr_t)(hint?hint:LOWEST); do { addr = nextFree(addr, 0x10000); uintptr_t sz = maxFree(addr, size); diff --git a/src/librarian/librarian.c b/src/librarian/librarian.c index adcf647e..02a02ec6 100755 --- a/src/librarian/librarian.c +++ b/src/librarian/librarian.c @@ -342,6 +342,7 @@ int AddNeededLib_init(lib_t* maplib, needed_libs_t* neededlibs, library_t* depli EXPORTDYN int AddNeededLib(lib_t* maplib, needed_libs_t* neededlibs, library_t* deplib, int local, int bindnow, const char** paths, int npath, box64context_t* box64, x64emu_t* emu) { + box64_mapclean = 0; if(!neededlibs) { neededlibs = alloca(sizeof(needed_libs_t)); memset(neededlibs, 0, sizeof(needed_libs_t)); diff --git a/src/librarian/library.c b/src/librarian/library.c index 4ed54096..85e4dfc3 100755 --- a/src/librarian/library.c +++ b/src/librarian/library.c @@ -198,7 +198,6 @@ static void initNativeLib(library_t *lib, box64context_t* context) { return; // non blocker... } printf_log(LOG_INFO, "Using native(wrapped) %s\n", lib->name); - box64_mapclean = 0; lib->priv.w.box64lib = context->box64lib; lib->context = context; lib->fini = wrappedlibs[i].fini; diff --git a/src/libtools/signals.c b/src/libtools/signals.c index a98b570a..e0410b1c 100755 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -505,7 +505,7 @@ void my_sigactionhandler_oldcode(int32_t sig, int simple, siginfo_t* info, void sigcontext->uc_mcontext.gregs[X64_RBP] = R_RBP; sigcontext->uc_mcontext.gregs[X64_RSP] = R_RSP; sigcontext->uc_mcontext.gregs[X64_RBX] = R_RBX; - sigcontext->uc_mcontext.gregs[X64_RIP] = R_RIP;//emu->old_ip; // old_ip should be more accurate as the "current" IP, but it's not always up-to-date + sigcontext->uc_mcontext.gregs[X64_RIP] = emu->old_ip; // flags sigcontext->uc_mcontext.gregs[X64_EFL] = emu->eflags.x64; // get segments @@ -934,10 +934,7 @@ exit(-1); const char* x64name = NULL; const char* elfname = NULL; x64emu_t* emu = thread_get_emu(); - // Adjust RIP for special case of NULL function run - if(sig==SIGSEGV && R_RIP==0x1 && (uintptr_t)info->si_addr==0x0) - R_RIP = 0x0; - x64pc = R_RIP; + x64pc = emu->old_ip; rsp = (void*)R_RSP; #if defined(DYNAREC) #if defined(ARM64) diff --git a/src/tools/box64stack.c b/src/tools/box64stack.c index 9a5ca602..5ede282e 100755 --- a/src/tools/box64stack.c +++ b/src/tools/box64stack.c @@ -167,6 +167,7 @@ void SetupInitialStack(x64emu_t *emu) Push(emu, p_random); Push(emu, 25); //AT_RANDOM(25)=p_random Push(emu, 0); Push(emu, 26); //AT_HWCAP2(26)=0 Push(emu, p_arg0); Push(emu, 31); //AT_EXECFN(31)=p_arg0 + Push(emu, emu->context->vsyscall); Push(emu, 32); //AT_SYSINFO(32)=vsyscall //Push(emu, 0); Push(emu, 33); //AT_SYSINFO_EHDR(33)=address of vDSO if(!emu->context->auxval_start) // store auxval start if needed emu->context->auxval_start = (uintptr_t*)R_RSP; |