From bf31940091acff45e2dd71904eccf0c1dd8f7daf Mon Sep 17 00:00:00 2001 From: DwifteJB Date: Wed, 4 Mar 2026 21:15:46 +0000 Subject: [PATCH 1/5] fix: auto-detect winsysroot from msbuild location & replace /winsysroot with explicit -imsvc paths --- cmake/LinuxCrosscompile.cmake | 40 ++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/cmake/LinuxCrosscompile.cmake b/cmake/LinuxCrosscompile.cmake index b4017da8b..558dd70c0 100644 --- a/cmake/LinuxCrosscompile.cmake +++ b/cmake/LinuxCrosscompile.cmake @@ -7,10 +7,44 @@ set(CMAKE_LINKER lld-link) set(CMAKE_C_COMPILER_FRONTEND_VARIANT MSVC) set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT MSVC) -add_compile_options(/winsysroot /opt/msvc --target=x86_64-pc-windows-msvc -fms-compatibility -fms-extensions -fdelayed-template-parsing) -add_link_options(/winsysroot:/opt/msvc) +# rm: locate winsysroot via the msbuild.exe path +find_program(_msbuild_exe msbuild) +if(_msbuild_exe) + get_filename_component(_msbuild_bin ${_msbuild_exe} DIRECTORY) # .../bin/x64 + get_filename_component(_candidate "${_msbuild_bin}/.." ABSOLUTE) # .../bin + if(NOT IS_DIRECTORY "${_candidate}/vc") + get_filename_component(_candidate "${_candidate}/.." ABSOLUTE) # .../ + endif() + set(MSVC_WINSYSROOT ${_candidate}) +else() + # rm: assume /opt/msvc as a fallback (which is usually the default path) + set(MSVC_WINSYSROOT /opt/msvc) +endif() -#set(CMAKE_RC_COMPILE_OBJECT " /I /opt/msvc/kits/10/include/10.0.26100.0/shared /fo ") +# rm: detect msvc version +file(GLOB _msvc_versions LIST_DIRECTORIES true ${MSVC_WINSYSROOT}/VC/Tools/MSVC/*) +list(GET _msvc_versions 0 _msvc_dir) + +# rm: detect window sdk version +file(GLOB _winsdk_versions LIST_DIRECTORIES true ${MSVC_WINSYSROOT}/kits/10/Include/*) +list(GET _winsdk_versions 0 _winsdk_dir) +get_filename_component(_winsdk_ver ${_winsdk_dir} NAME) + +add_compile_options( + --target=x86_64-pc-windows-msvc + -fms-compatibility + -fms-extensions + -fdelayed-template-parsing + # rm: paths to msvc and windows sdk headers + "-imsvc${_msvc_dir}/include" + "-imsvc${_msvc_dir}/atlmfc/include" + "-imsvc${MSVC_WINSYSROOT}/kits/10/Include/${_winsdk_ver}/ucrt" + "-imsvc${MSVC_WINSYSROOT}/kits/10/Include/${_winsdk_ver}/um" + "-imsvc${MSVC_WINSYSROOT}/kits/10/Include/${_winsdk_ver}/shared" + "-imsvc${MSVC_WINSYSROOT}/kits/10/Include/${_winsdk_ver}/winrt" +) + +add_link_options(/winsysroot:${MSVC_WINSYSROOT}) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) From ee78a74025b78b0c5c813a7beb7c94629a30c2ff Mon Sep 17 00:00:00 2001 From: DwifteJB Date: Wed, 4 Mar 2026 21:27:29 +0000 Subject: [PATCH 2/5] fix: implement IobShim.cpp --- Minecraft.Client/IobShim.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Minecraft.Client/IobShim.cpp b/Minecraft.Client/IobShim.cpp index bb7b9b29e..a3059f496 100644 --- a/Minecraft.Client/IobShim.cpp +++ b/Minecraft.Client/IobShim.cpp @@ -1,5 +1,7 @@ // Original file is iob_shim.asm // Rewritten in C because the build system breaks on linux-windows crosscomp with this +// rm: __declspec(naked) is seemingly(?) not working on x86_64 (atleast via wine); use __attribute__((naked)) instead. + #if 0 .code EXTRN __acrt_iob_func:PROC @@ -14,7 +16,11 @@ END #include -extern "C" FILE* __cdecl __iob_func ( void ) { - static FILE iob [ ] = { *stdin, *stdout, *stderr }; - return iob; +extern "C" FILE* __cdecl __acrt_iob_func(unsigned index); + +extern "C" __attribute__((naked)) FILE* __cdecl __iob_func(void) { + __asm__( + "xorl %ecx, %ecx\n\t" + "jmp __acrt_iob_func" + ); } From 1558de3a7b52c5e03a10a2624c2b1603e22a218e Mon Sep 17 00:00:00 2001 From: DwifteJB Date: Wed, 4 Mar 2026 21:38:45 +0000 Subject: [PATCH 3/5] fix: use intel_syntax --- Minecraft.Client/IobShim.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Minecraft.Client/IobShim.cpp b/Minecraft.Client/IobShim.cpp index a3059f496..2ad1a253b 100644 --- a/Minecraft.Client/IobShim.cpp +++ b/Minecraft.Client/IobShim.cpp @@ -20,7 +20,9 @@ extern "C" FILE* __cdecl __acrt_iob_func(unsigned index); extern "C" __attribute__((naked)) FILE* __cdecl __iob_func(void) { __asm__( - "xorl %ecx, %ecx\n\t" - "jmp __acrt_iob_func" + ".intel_syntax noprefix\n\t" + "xor ecx, ecx\n\t" + "jmp __acrt_iob_func\n\t" + ".att_syntax prefix" ); } From 9ffd437a4bbedab0f275e21e8222137ec19917b8 Mon Sep 17 00:00:00 2001 From: DwifteJB Date: Wed, 4 Mar 2026 21:42:04 +0000 Subject: [PATCH 4/5] fix: xor -> mov to be "identical" --- .vscode/settings.json | 11 +++++++++++ Minecraft.Client/IobShim.cpp | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..8454731ee --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,11 @@ +{ + "cmake.configureArgs": [ + "-DCMAKE_TOOLCHAIN_FILE=${workspaceFolder}/cmake/LinuxCrosscompile.cmake" + ], + "cmake.configureEnvironment": { + "CC": "cl", + "CXX": "cl" + }, + "cmake.generator": "Ninja", + "cmake.buildDirectory": "${workspaceFolder}/build" +} diff --git a/Minecraft.Client/IobShim.cpp b/Minecraft.Client/IobShim.cpp index 2ad1a253b..7aefbe3f9 100644 --- a/Minecraft.Client/IobShim.cpp +++ b/Minecraft.Client/IobShim.cpp @@ -21,7 +21,7 @@ extern "C" FILE* __cdecl __acrt_iob_func(unsigned index); extern "C" __attribute__((naked)) FILE* __cdecl __iob_func(void) { __asm__( ".intel_syntax noprefix\n\t" - "xor ecx, ecx\n\t" + "mov ecx, 0\n\t" "jmp __acrt_iob_func\n\t" ".att_syntax prefix" ); From e3e06bcc801dc509f3cbc55e49c74f97425d60fe Mon Sep 17 00:00:00 2001 From: Robbie Morgan <67983181+DwifteJB@users.noreply.github.com> Date: Wed, 4 Mar 2026 21:42:36 +0000 Subject: [PATCH 5/5] delete .vscode, oops. --- .vscode/settings.json | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 8454731ee..000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "cmake.configureArgs": [ - "-DCMAKE_TOOLCHAIN_FILE=${workspaceFolder}/cmake/LinuxCrosscompile.cmake" - ], - "cmake.configureEnvironment": { - "CC": "cl", - "CXX": "cl" - }, - "cmake.generator": "Ninja", - "cmake.buildDirectory": "${workspaceFolder}/build" -}