diff --git a/Minecraft.Client/IobShim.cpp b/Minecraft.Client/IobShim.cpp index bb7b9b29e..7aefbe3f9 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,13 @@ 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__( + ".intel_syntax noprefix\n\t" + "mov ecx, 0\n\t" + "jmp __acrt_iob_func\n\t" + ".att_syntax prefix" + ); } 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)