diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-01-22 17:29:21 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-22 10:29:21 +0100 |
| commit | 89dcd2566bfa1ef93e740b568cbc3aa5c5409aa4 (patch) | |
| tree | af3e95e694fb620ccb2d955a74a0aab0ad14c29e /src | |
| parent | 314edea645acacf03930af17aa01783ca735306a (diff) | |
| download | box64-89dcd2566bfa1ef93e740b568cbc3aa5c5409aa4.tar.gz box64-89dcd2566bfa1ef93e740b568cbc3aa5c5409aa4.zip | |
Fixed various issues introduced in the env infra refactor (#2281)
* Open trace file again after apply env files * dynrec_df=1 by default * more fixes * more fixes * more
Diffstat (limited to 'src')
| -rw-r--r-- | src/core.c | 29 | ||||
| -rw-r--r-- | src/elfs/elfloader.c | 24 | ||||
| -rw-r--r-- | src/include/elfloader.h | 3 | ||||
| -rw-r--r-- | src/include/env.h | 185 | ||||
| -rw-r--r-- | src/tools/env.c | 29 |
5 files changed, 121 insertions, 149 deletions
diff --git a/src/core.c b/src/core.c index 08343c66..313cac88 100644 --- a/src/core.c +++ b/src/core.c @@ -117,9 +117,9 @@ FILE* ftrace = NULL; char* ftrace_name = NULL; int ftrace_has_pid = 0; -void openFTrace(const char* newtrace, int reopen) +void openFTrace(int reopen) { - const char* p = newtrace?newtrace:BOX64ENV(trace_file); + const char* p = BOX64ENV(trace_file); #ifndef MAX_PATH #define MAX_PATH 4096 #endif @@ -217,7 +217,7 @@ void my_prepare_fork() void my_parent_fork() { if (ftrace_has_pid) { - openFTrace(NULL, 1); + openFTrace(1); printf_log(LOG_INFO, "%04d|Reopened trace file of %s at parent\n", GetTID(), GetLastApplyEntryName()); } } @@ -225,7 +225,7 @@ void my_parent_fork() void my_child_fork() { if (ftrace_has_pid) { - openFTrace(NULL, 0); + openFTrace(0); printf_log(LOG_INFO, "%04d|Created trace file of %s at child\n", GetTID(), GetLastApplyEntryName()); } } @@ -435,8 +435,7 @@ void computeRDTSC() static void displayMiscInfo() { - // grab BOX64ENV(trace_file), and change %pid to actual pid is present in the name - openFTrace(NULL, 0); + openFTrace(0); if ((BOX64ENV(nobanner) || BOX64ENV(log)) && ftrace==stdout) box64_stdout_no_w = 1; @@ -538,23 +537,6 @@ void PrintHelp() { printf(" '-h'|'--help' to print this and quit\n"); } -void addNewEnvVar(const char* s) -{ - if(!s) - return; - char* p = box_strdup(s); - char* e = strchr(p, '='); - if(!e) { - printf_log(LOG_INFO, "Invalid specific env. var. '%s'\n", s); - box_free(p); - return; - } - *e='\0'; - ++e; - setenv(p, e, 1); - box_free(p); -} - static void addLibPaths(box64context_t* context) { if(BOX64ENV(emulated_libs)) { @@ -1155,6 +1137,7 @@ int initialize(int argc, const char **argv, char** env, x64emu_t** emulator, elf ApplyEnvFileEntry(wine_prog); wine_prog = NULL; } + openFTrace(0); PrintEnvVariables(); for(int i=1; i<my_context->argc; ++i) { diff --git a/src/elfs/elfloader.c b/src/elfs/elfloader.c index 11943c1a..eff1ef69 100644 --- a/src/elfs/elfloader.c +++ b/src/elfs/elfloader.c @@ -1451,30 +1451,6 @@ void* GetDynamicSection(elfheader_t* h) return box64_is32bits?((void*)h->Dynamic._32):((void*)h->Dynamic._64); } -#ifdef DYNAREC -dynablock_t* GetDynablocksFromAddress(box64context_t *context, uintptr_t addr) -{ - (void)context; - // if we are here, the there is not block in standard "space" - /*dynablocklist_t* ret = getDBFromAddress(addr); - if(ret) { - return ret; - }*/ - if(BOX64ENV(dynarec_forced)) { - addDBFromAddressRange(addr, 1); - return getDB(addr); - } - //check if address is in an elf... if yes, grant a block (should I warn) - Dl_info info; - if(dladdr((void*)addr, &info)) { - dynarec_log(LOG_INFO, "Address %p is in a native Elf memory space (function \"%s\" in %s)\n", (void*)addr, info.dli_sname, info.dli_fname); - return NULL; - } - dynarec_log(LOG_INFO, "Address %p not found in Elf memory and is not a native call wrapper\n", (void*)addr); - return NULL; -} -#endif - typedef struct my_dl_phdr_info_s { void* dlpi_addr; const char* dlpi_name; diff --git a/src/include/elfloader.h b/src/include/elfloader.h index cec7195d..969cb95b 100644 --- a/src/include/elfloader.h +++ b/src/include/elfloader.h @@ -69,9 +69,6 @@ int32_t GetTLSBase(elfheader_t* h); uint32_t GetTLSSize(elfheader_t* h); void* GetTLSPointer(box64context_t* context, elfheader_t* h); void* GetDTatOffset(box64context_t* context, unsigned long int index, unsigned long int offset); -#ifdef DYNAREC -dynablock_t* GetDynablocksFromAddress(box64context_t *context, uintptr_t addr); -#endif void ResetSpecialCaseMainElf(elfheader_t* h); void CreateMemorymapFile(box64context_t* context, int fd); void* GetDynamicSection(elfheader_t* h); diff --git a/src/include/env.h b/src/include/env.h index 0b808dd5..598cb1db 100644 --- a/src/include/env.h +++ b/src/include/env.h @@ -23,99 +23,98 @@ extern char* ftrace_name; #define DEFAULT_LOG_LEVEL (ftrace_name ? LOG_INFO : (isatty(fileno(stdout)) ? LOG_INFO : LOG_NONE)) -#define ENVSUPER1() \ - STRING(BOX64_ADDLIBS, addlibs) \ - BOOLEAN(BOX64_ALLOWMISSINGLIBS, allow_missing_libs, 0) \ - STRING(BOX64_ARGS, args) \ - STRING(BOX64_BASH, bash) \ - BOOLEAN(BOX64_CEFDISABLEGPU, cefdisablegpu, 0) \ - BOOLEAN(BOX64_CEFDISABLEGPUCOMPOSITOR, cefdisablegpucompositor, 0) \ - INTEGER(BOX64_CPUTYPE, cputype, 0, 0, 1) \ - BOOLEAN(BOX64_CRASHHANDLER, dummy_crashhandler, 1) \ - BOOLEAN(BOX64_DLSYM_ERROR, dlsym_error, 0) \ - INTEGER(BOX64_DUMP, dump, 0, 0, 2) \ - BOOLEAN(BOX64_DYNAREC_ALIGNED_ATOMICS, dynarec_aligned_atomics, 0) \ - INTEGER(BOX64_DYNAREC_BIGBLOCK, dynarec_bigblock, 1, 0, 3) \ - BOOLEAN(BOX64_DYNAREC_BLEEDING_EDGE, dynarec_bleeding_edge, 1) \ - BOOLEAN(BOX64_DYNAREC_CALLRET, dynarec_callret, 0) \ - BOOLEAN(BOX64_DYNAREC_DF, dynarec_df, 0) \ - BOOLEAN(BOX64_DYNAREC_DIRTY, dynarec_dirty, 0) \ - BOOLEAN(BOX64_DYNAREC_DIV0, dynarec_div0, 0) \ - INTEGER(BOX64_DYNAREC_DUMP, dynarec_dump, 0, 0, 2) \ - BOOLEAN(BOX64_DYNAREC_FASTNAN, dynarec_fastnan, 1) \ - BOOLEAN(BOX64_DYNAREC_FASTROUND, dynarec_fastround, 1) \ - BOOLEAN(BOX64_DYNAREC_FORCED, dynarec_forced, 0) \ - INTEGER(BOX64_DYNAREC_FORWARD, dynarec_forward, 128, 0, 1024) \ - BOOLEAN(BOX64_DYNAREC_GDBJIT, dynarec_gdbjit, 0) \ - INTEGER(BOX64_DYNAREC_LOG, dynarec_log, 0, 0, 3) \ - BOOLEAN(BOX64_DYNAREC_MISSING, dynarec_missing, 0) \ - BOOLEAN(BOX64_DYNAREC_NATIVEFLAGS, dynarec_nativeflags, 1) \ - INTEGER(BOX64_DYNAREC_PAUSE, dynarec_pause, 0, 0, 3) \ - BOOLEAN(BOX64_DYNAREC_PERFMAP, dynarec_perf_map, 0) \ - INTEGER(BOX64_DYNAREC_SAFEFLAGS, dynarec_safeflags, 1, 0, 2) \ - BOOLEAN(BOX64_DYNAREC_STRONGMEM, dynarec_strongmem, 0) \ - BOOLEAN(BOX64_DYNAREC_TBB, dynarec_tbb, 1) \ - STRING(BOX64_DYNAREC_TEST, dynarec_test_str) \ - BOOLEAN(BOX64_DYNAREC_TRACE, dynarec_trace, 0) \ - BOOLEAN(BOX64_DYNAREC_WAIT, dynarec_wait, 1) \ - BOOLEAN(BOX64_DYNAREC_WEAKBARRIER, dynarec_weakbarrier, 1) \ - BOOLEAN(BOX64_DYNAREC_X87DOUBLE, dynarec_x87double, 0) \ - STRING(BOX64_EMULATED_LIBS, emulated_libs) \ - STRING(BOX64_ENV, env) \ - STRING(BOX64_ENV1, env1) \ - STRING(BOX64_ENV2, env2) \ - STRING(BOX64_ENV3, env3) \ - STRING(BOX64_ENV4, env4) \ - STRING(BOX64_ENV5, env5) \ - BOOLEAN(BOX64_EXIT, exit, 0) \ - BOOLEAN(BOX64_FIX_64BIT_INODES, fix_64bit_inodes, 0) \ - BOOLEAN(BOX64_IGNOREINT3, ignoreint3, 0) \ - STRING(BOX64_INSERT_ARGS, insert_args) \ - BOOLEAN(BOX64_INPROCESSGPU, inprocessgpu, 0) \ - BOOLEAN(BOX64_JITGDB, jitgdb, 0) \ - BOOLEAN(BOX64_JVM, jvm, 1) \ - STRING(BOX64_LD_LIBRARY_PATH, ld_library_path) \ - BOOLEAN(BOX64_LIBCEF, libcef, 1) \ - STRING(BOX64_LIBGL, libgl) \ - ADDRESS(BOX64_LOAD_ADDR, load_addr) \ - INTEGER(BOX64_LOG, log, DEFAULT_LOG_LEVEL, 0, 3) \ - BOOLEAN(BOX64_MALLOC_HACK, malloc_hack, 0) \ - INTEGER(BOX64_MAXCPU, new_maxcpu, 0, 0, 100) \ - BOOLEAN(BOX64_NOBANNER, nobanner, (isatty(fileno(stdout)) ? 0 : 1)) \ - STRING(BOX64_NODYNAREC, nodynarec) \ - BOOLEAN(BOX64_NOGTK, nogtk, 0) \ - BOOLEAN(BOX64_NOPULSE, nopulse, 0) \ - BOOLEAN(BOX64_NORCFILES, noenvfiles, 0) \ - BOOLEAN(BOX64_NOSANDBOX, nosandbox, 0) \ - BOOLEAN(BOX64_NOSIGSEGV, nosigsegv, 0) \ - BOOLEAN(BOX64_NOSIGILL, nosigill, 0) \ - BOOLEAN(BOX64_NOVULKAN, novulkan, 0) \ - STRING(BOX64_PATH, path) \ - BOOLEAN(BOX64_PREFER_EMULATED, prefer_emulated, 0) \ - BOOLEAN(BOX64_PREFER_WRAPPED, prefer_wrapped, 0) \ - STRING(BOX64_RCFILE, envfile) \ - BOOLEAN(BOX64_RDTSC_1GHZ, rdtsc_1ghz, 0) \ - BOOLEAN(BOX64_RESERVE_HIGH, reserve_high, 0) \ - BOOLEAN(BOX64_ROLLING_LOG, rolling_log, 0) \ - BOOLEAN(BOX64_SDL2_JGUID, sdl2_jguid, 0) \ - BOOLEAN(BOX64_SHAEXT, shaext, 1) \ - BOOLEAN(BOX64_SHOWBT, showbt, 0) \ - BOOLEAN(BOX64_SHOWSEGV, showsegv, 0) \ - BOOLEAN(BOX64_SSE_FLUSHTO0, sse_flushto0, 0) \ - BOOLEAN(BOX64_SSE42, sse42, 1) \ - BOOLEAN(BOX64_SYNC_ROUNDING, sync_rounding, 0) \ - BOOLEAN(BOX64_TRACE_COLOR, trace_regsdiff, 0) \ - BOOLEAN(BOX64_TRACE_EMM, trace_emm, 0) \ - STRING(BOX64_TRACE_FILE, trace_file) \ - STRING(BOX64_TRACE_INIT, trace_init) \ - INTEGER64(BOX64_TRACE_START, start_cnt, 0) \ - BOOLEAN(BOX64_TRACE_XMM, trace_xmm, 0) \ - STRING(BOX64_TRACE, trace) \ - BOOLEAN(BOX64_UNITYPLAYER, unityplayer, 1) \ - BOOLEAN(BOX64_WRAP_EGL, wrap_egl, 0) \ - BOOLEAN(BOX64_X11GLX, x11glx, 1) \ - BOOLEAN(BOX64_X11SYNC, x11sync, 0) \ - BOOLEAN(BOX64_X11THREADS, x11threads, 0) \ +#define ENVSUPER1() \ + STRING(BOX64_ADDLIBS, addlibs) \ + BOOLEAN(BOX64_ALLOWMISSINGLIBS, allow_missing_libs, 0) \ + STRING(BOX64_ARGS, args) \ + STRING(BOX64_BASH, bash) \ + BOOLEAN(BOX64_CEFDISABLEGPU, cefdisablegpu, 0) \ + BOOLEAN(BOX64_CEFDISABLEGPUCOMPOSITOR, cefdisablegpucompositor, 0) \ + INTEGER(BOX64_CPUTYPE, cputype, 0, 0, 1) \ + BOOLEAN(BOX64_CRASHHANDLER, dummy_crashhandler, 1) \ + BOOLEAN(BOX64_DLSYM_ERROR, dlsym_error, 0) \ + INTEGER(BOX64_DUMP, dump, 0, 0, 2) \ + BOOLEAN(BOX64_DYNAREC_ALIGNED_ATOMICS, dynarec_aligned_atomics, 0) \ + INTEGER(BOX64_DYNAREC_BIGBLOCK, dynarec_bigblock, 1, 0, 3) \ + BOOLEAN(BOX64_DYNAREC_BLEEDING_EDGE, dynarec_bleeding_edge, 1) \ + BOOLEAN(BOX64_DYNAREC_CALLRET, dynarec_callret, 0) \ + BOOLEAN(BOX64_DYNAREC_DF, dynarec_df, 1) \ + BOOLEAN(BOX64_DYNAREC_DIRTY, dynarec_dirty, 0) \ + BOOLEAN(BOX64_DYNAREC_DIV0, dynarec_div0, 0) \ + INTEGER(BOX64_DYNAREC_DUMP, dynarec_dump, 0, 0, 2) \ + BOOLEAN(BOX64_DYNAREC_FASTNAN, dynarec_fastnan, 1) \ + INTEGER(BOX64_DYNAREC_FASTROUND, dynarec_fastround, 1, 0, 2) \ + INTEGER(BOX64_DYNAREC_FORWARD, dynarec_forward, 128, 0, 1024) \ + INTEGER(BOX64_DYNAREC_GDBJIT, dynarec_gdbjit, 0, 0, 2) \ + INTEGER(BOX64_DYNAREC_LOG, dynarec_log, 0, 0, 3) \ + INTEGER(BOX64_DYNAREC_MISSING, dynarec_missing, 0, 0, 2) \ + BOOLEAN(BOX64_DYNAREC_NATIVEFLAGS, dynarec_nativeflags, 1) \ + INTEGER(BOX64_DYNAREC_PAUSE, dynarec_pause, 0, 0, 3) \ + BOOLEAN(BOX64_DYNAREC_PERFMAP, dynarec_perf_map, 0) \ + INTEGER(BOX64_DYNAREC_SAFEFLAGS, dynarec_safeflags, 1, 0, 2) \ + BOOLEAN(BOX64_DYNAREC_STRONGMEM, dynarec_strongmem, 0) \ + BOOLEAN(BOX64_DYNAREC_TBB, dynarec_tbb, 1) \ + STRING(BOX64_DYNAREC_TEST, dynarec_test_str) \ + BOOLEAN(BOX64_DYNAREC_TRACE, dynarec_trace, 0) \ + BOOLEAN(BOX64_DYNAREC_WAIT, dynarec_wait, 1) \ + BOOLEAN(BOX64_DYNAREC_WEAKBARRIER, dynarec_weakbarrier, 1) \ + BOOLEAN(BOX64_DYNAREC_X87DOUBLE, dynarec_x87double, 0) \ + STRING(BOX64_EMULATED_LIBS, emulated_libs) \ + STRING(BOX64_ENV, env) \ + STRING(BOX64_ENV1, env1) \ + STRING(BOX64_ENV2, env2) \ + STRING(BOX64_ENV3, env3) \ + STRING(BOX64_ENV4, env4) \ + STRING(BOX64_ENV5, env5) \ + BOOLEAN(BOX64_EXIT, exit, 0) \ + BOOLEAN(BOX64_FIX_64BIT_INODES, fix_64bit_inodes, 0) \ + BOOLEAN(BOX64_IGNOREINT3, ignoreint3, 0) \ + STRING(BOX64_INSERT_ARGS, insert_args) \ + BOOLEAN(BOX64_INPROCESSGPU, inprocessgpu, 0) \ + BOOLEAN(BOX64_JITGDB, jitgdb, 0) \ + BOOLEAN(BOX64_JVM, jvm, 1) \ + STRING(BOX64_LD_LIBRARY_PATH, ld_library_path) \ + BOOLEAN(BOX64_LIBCEF, libcef, 1) \ + STRING(BOX64_LIBGL, libgl) \ + ADDRESS(BOX64_LOAD_ADDR, load_addr) \ + INTEGER(BOX64_LOG, log, DEFAULT_LOG_LEVEL, 0, 3) \ + BOOLEAN(BOX64_MALLOC_HACK, malloc_hack, 0) \ + INTEGER(BOX64_MAXCPU, new_maxcpu, 0, 0, 100) \ + BOOLEAN(BOX64_NOBANNER, nobanner, (isatty(fileno(stdout)) ? 0 : 1)) \ + STRING(BOX64_NODYNAREC, nodynarec) \ + BOOLEAN(BOX64_NOGTK, nogtk, 0) \ + BOOLEAN(BOX64_NOPULSE, nopulse, 0) \ + BOOLEAN(BOX64_NORCFILES, noenvfiles, 0) \ + BOOLEAN(BOX64_NOSANDBOX, nosandbox, 0) \ + BOOLEAN(BOX64_NOSIGSEGV, nosigsegv, 0) \ + BOOLEAN(BOX64_NOSIGILL, nosigill, 0) \ + BOOLEAN(BOX64_NOVULKAN, novulkan, 0) \ + STRING(BOX64_PATH, path) \ + BOOLEAN(BOX64_PREFER_EMULATED, prefer_emulated, 0) \ + BOOLEAN(BOX64_PREFER_WRAPPED, prefer_wrapped, 0) \ + STRING(BOX64_RCFILE, envfile) \ + BOOLEAN(BOX64_RDTSC_1GHZ, rdtsc_1ghz, 0) \ + BOOLEAN(BOX64_RESERVE_HIGH, reserve_high, 0) \ + BOOLEAN(BOX64_ROLLING_LOG, rolling_log, 0) \ + BOOLEAN(BOX64_SDL2_JGUID, sdl2_jguid, 0) \ + BOOLEAN(BOX64_SHAEXT, shaext, 1) \ + BOOLEAN(BOX64_SHOWBT, showbt, 0) \ + BOOLEAN(BOX64_SHOWSEGV, showsegv, 0) \ + BOOLEAN(BOX64_SSE_FLUSHTO0, sse_flushto0, 0) \ + BOOLEAN(BOX64_SSE42, sse42, 1) \ + BOOLEAN(BOX64_SYNC_ROUNDING, sync_rounding, 0) \ + BOOLEAN(BOX64_TRACE_COLOR, trace_regsdiff, 0) \ + BOOLEAN(BOX64_TRACE_EMM, trace_emm, 0) \ + STRING(BOX64_TRACE_FILE, trace_file) \ + STRING(BOX64_TRACE_INIT, trace_init) \ + INTEGER64(BOX64_TRACE_START, start_cnt, 0) \ + BOOLEAN(BOX64_TRACE_XMM, trace_xmm, 0) \ + STRING(BOX64_TRACE, trace) \ + BOOLEAN(BOX64_UNITYPLAYER, unityplayer, 1) \ + BOOLEAN(BOX64_WRAP_EGL, wrap_egl, 0) \ + BOOLEAN(BOX64_X11GLX, x11glx, 1) \ + BOOLEAN(BOX64_X11SYNC, x11sync, 0) \ + BOOLEAN(BOX64_X11THREADS, x11threads, 0) \ BOOLEAN(BOX64_X87_NO80BITS, x87_no80bits, 0) #ifdef ARM64 diff --git a/src/tools/env.c b/src/tools/env.c index ae19c8ad..4f61083a 100644 --- a/src/tools/env.c +++ b/src/tools/env.c @@ -66,6 +66,23 @@ static const char default_rcfile[] = "BOX64_EXIT=1\n" ; + +static void addNewEnvVar(const char* s) +{ + if (!s) return; + char* p = box_strdup(s); + char* e = strchr(p, '='); + if (!e) { + printf_log(LOG_INFO, "Invalid specific env. var. '%s'\n", s); + box_free(p); + return; + } + *e = '\0'; + ++e; + setenv(p, e, 1); + box_free(p); +} + static void applyCustomRules() { if (BOX64ENV(log) == LOG_NEVER) { @@ -142,12 +159,12 @@ static void applyCustomRules() if (box64env.exit) exit(0); - if (box64env.env) setenv("BOX64_ENV", "1", 1); - if (box64env.env1) setenv("BOX64_ENV1", "1", 1); - if (box64env.env2) setenv("BOX64_ENV2", "1", 1); - if (box64env.env3) setenv("BOX64_ENV3", "1", 1); - if (box64env.env4) setenv("BOX64_ENV4", "1", 1); - if (box64env.env5) setenv("BOX64_ENV5", "1", 1); + if (box64env.env) addNewEnvVar(box64env.env); + if (box64env.env1) addNewEnvVar(box64env.env1); + if (box64env.env2) addNewEnvVar(box64env.env2); + if (box64env.env3) addNewEnvVar(box64env.env3); + if (box64env.env4) addNewEnvVar(box64env.env4); + if (box64env.env5) addNewEnvVar(box64env.env5); } static void trimStringInplace(char* s) |