rust-lang / rust

Empowering everyone to build reliable and efficient software.
https://www.rust-lang.org
Other
96.95k stars 12.53k forks source link

rust-mingw is missing libssp* #68973

Open glandium opened 4 years ago

glandium commented 4 years ago

The GCC compiler that comes with rust-mingw understands -fstack-protector-strong and emits stack-protector code, but the build further fails to link with messages like:

C:\Users\task_1581171456\repo\git-core\libcinnabar.a(cinnabar-fast-import.o):cinnabar-fast-import.c:(.text+0x291): undefined reference to `__stack_chk_fail'

The missing symbol is normally added by gcc to the ld command line via -lssp_nonshared -lssp, when it's passed -fstack-protector-strong during linking. Adding -fstack-protector-strong via RUSTFLAGS=-Clink-arg=-fstack-protector-strong doesn't actually work because of -nostdlib that rust adds on its own, but RUSTFLAGS=-Clink-arg=-lssp_nonshared -Clink-arg=-lssp doesn't work either because libssp* is not provided by rust-mingw.

mati865 commented 4 years ago

This should work with beta and nightly when you have external MinGW installed and added to PATH.

infinity0 commented 4 years ago

@mati865 Can you clarify what is supposed to work? Direcctly out-of-the-box, or adding -lssp to RUSTFLAGS? I am trying to cross-compile to target x86_64-pc-windows-gnu from host x86_64-unknown-linux-gnu, and getting the same error:

  = note: "x86_64-w64-mingw32-gcc" "-fno-use-linker-plugin" "-Wl,--nxcompat" "-m64" "-nostartfiles" "/usr/x86_64-w64-mingw32/lib/dllcrt2.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2/lib/rustlib/x86_64-pc-windows-gnu/lib/rsbegin.o" "-L" "$PWD/build/x86_64-unknown-linux-gnu/stage2/lib/rustlib/x86_64-pc-windows-gnu/lib" "-L" "$PWD/build/x86_64-unknown-linux-gnu/stage2/lib/rustlib/x86_64-pc-windows-gnu/lib/self-contained" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.0.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.1.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.10.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.11.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.12.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.13.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.14.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.15.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.2.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.3.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.4.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.5.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.6.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.7.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.8.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.9.rcgu.o" "-o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.dll" "-Wl,--version-script=/tmp/rustcZTXjqb/list" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.gy76lupzofoxc6f.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.14pxj9r50qad4vso.rcgu.o" "-shared" "-Wl,--out-implib,$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/libstd-f849842eec509894.dll.a" "-nodefaultlibs" "-L" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps" "-L" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/release/deps" "-L" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/build/backtrace-sys-73393a103395095f/out" "-L" "$PWD/build/x86_64-unknown-linux-gnu/stage2/lib/rustlib/x86_64-pc-windows-gnu/lib" "-ladvapi32" "-lws2_32" "-luserenv" "-Wl,-Bstatic" "-Wl,--whole-archive" "/tmp/rustcZTXjqb/libpanic_unwind-9c93af3a21bf779f.rlib" "-Wl,--no-whole-archive" "-Wl,--whole-archive" "/tmp/rustcZTXjqb/libhashbrown-951231d947810b4e.rlib" "-Wl,--no-whole-archive" "-Wl,--whole-archive" "/tmp/rustcZTXjqb/librustc_std_workspace_alloc-4397ecfaeb9d832e.rlib" "-Wl,--no-whole-archive" "-Wl,--whole-archive" "/tmp/rustcZTXjqb/libbacktrace-4ceb221c1451fd72.rlib" "-Wl,--no-whole-archive" "-Wl,--whole-archive" "/tmp/rustcZTXjqb/libbacktrace_sys-5ac9ad0bd2943e4c.rlib" "-Wl,--no-whole-archive" "-Wl,--whole-archive" "/tmp/rustcZTXjqb/librustc_demangle-176970e988fbc465.rlib" "-Wl,--no-whole-archive" "-Wl,--whole-archive" "/tmp/rustcZTXjqb/libunwind-204b2abdb5f7ae9a.rlib" "-Wl,--no-whole-archive" "-Wl,--whole-archive" "/tmp/rustcZTXjqb/libcfg_if-b787a80b1cca0552.rlib" "-Wl,--no-whole-archive" "-Wl,--whole-archive" "/tmp/rustcZTXjqb/liblibc-3072b25f7851b3d1.rlib" "-Wl,--no-whole-archive" "-Wl,--whole-archive" "/tmp/rustcZTXjqb/liballoc-62d18a8976d7c133.rlib" "-Wl,--no-whole-archive" "-Wl,--whole-archive" "/tmp/rustcZTXjqb/librustc_std_workspace_core-1b8ab73855770e4f.rlib" "-Wl,--no-whole-archive" "-Wl,--whole-archive" "/tmp/rustcZTXjqb/libcore-bae6c7eaa8cff910.rlib" "-Wl,--no-whole-archive" "/tmp/rustcZTXjqb/libcompiler_builtins-fa2917f0b54acfc4.rlib" "-Wl,-Bdynamic" "-lmsvcrt" "-lmingwex" "-lmingw32" "-lmsvcrt" "-luser32" "-lkernel32" "-lgcc_s" "-lgcc" "-lkernel32" "$PWD/build/x86_64-unknown-linux-gnu/stage2/lib/rustlib/x86_64-pc-windows-gnu/lib/rsend.o"
  = note: /usr/bin/x86_64-w64-mingw32-ld: /tmp/rustcZTXjqb/libbacktrace_sys-5ac9ad0bd2943e4c.rlib(dwarf.o): in function `snprintf':
          /usr/share/mingw-w64/include/stdio.h:893: undefined reference to `__stack_chk_fail'
          /usr/bin/x86_64-w64-mingw32-ld: /tmp/rustcZTXjqb/libbacktrace_sys-5ac9ad0bd2943e4c.rlib(dwarf.o): in function `read_uleb128':
          ./vendor/backtrace-sys/src/libbacktrace/dwarf.c:987: undefined reference to `__stack_chk_fail'
          /usr/bin/x86_64-w64-mingw32-ld: /tmp/rustcZTXjqb/libbacktrace_sys-5ac9ad0bd2943e4c.rlib(dwarf.o): in function `read_sleb128':
          ./vendor/backtrace-sys/src/libbacktrace/dwarf.c:1025: undefined reference to `__stack_chk_fail'
          /usr/bin/x86_64-w64-mingw32-ld: /tmp/rustcZTXjqb/libbacktrace_sys-5ac9ad0bd2943e4c.rlib(dwarf.o): in function `read_uint16':
          ./vendor/backtrace-sys/src/libbacktrace/dwarf.c:842: undefined reference to `__stack_chk_fail'
          /usr/bin/x86_64-w64-mingw32-ld: /tmp/rustcZTXjqb/libbacktrace_sys-5ac9ad0bd2943e4c.rlib(dwarf.o): in function `read_uint24':
          ./vendor/backtrace-sys/src/libbacktrace/dwarf.c:859: undefined reference to `__stack_chk_fail'
          /usr/bin/x86_64-w64-mingw32-ld: /tmp/rustcZTXjqb/libbacktrace_sys-5ac9ad0bd2943e4c.rlib(dwarf.o):./vendor/backtrace-sys/src/libbacktrace/dwarf.c:876: more undefined references to `__stack_chk_fail' follow
          /usr/bin/x86_64-w64-mingw32-ld: /tmp/rustcZTXjqb/libbacktrace_sys-5ac9ad0bd2943e4c.rlib(dwarf.o):dwarf.c:(.rdata$.refptr.__stack_chk_guard[.refptr.__stack_chk_guard]+0x0): undefined reference to `__stack_chk_guard'
          /usr/bin/x86_64-w64-mingw32-ld: /tmp/rustcZTXjqb/libbacktrace_sys-5ac9ad0bd2943e4c.rlib(fileline.o): in function `snprintf':
          /usr/share/mingw-w64/include/stdio.h:893: undefined reference to `__stack_chk_fail'
          /usr/bin/x86_64-w64-mingw32-ld: /tmp/rustcZTXjqb/libbacktrace_sys-5ac9ad0bd2943e4c.rlib(fileline.o): in function `__rdos_backtrace_pcinfo':
          ./vendor/backtrace-sys/src/libbacktrace/fileline.c:266: undefined reference to `__stack_chk_fail'
          /usr/bin/x86_64-w64-mingw32-ld: /tmp/rustcZTXjqb/libbacktrace_sys-5ac9ad0bd2943e4c.rlib(fileline.o): in function `__rdos_backtrace_syminfo':
          ./vendor/backtrace-sys/src/libbacktrace/fileline.c:283: undefined reference to `__stack_chk_fail'
          /usr/bin/x86_64-w64-mingw32-ld: /tmp/rustcZTXjqb/libbacktrace_sys-5ac9ad0bd2943e4c.rlib(state.o): in function `__rdos_backtrace_create_state':
          ./vendor/backtrace-sys/src/libbacktrace/state.c:72: undefined reference to `__stack_chk_fail'
          /usr/bin/x86_64-w64-mingw32-ld: /tmp/rustcZTXjqb/libbacktrace_sys-5ac9ad0bd2943e4c.rlib(pecoff.o): in function `coff_add':
          ./vendor/backtrace-sys/src/libbacktrace/pecoff.c:876: undefined reference to `__stack_chk_fail'
          /usr/bin/x86_64-w64-mingw32-ld: /tmp/rustcZTXjqb/libbacktrace_sys-5ac9ad0bd2943e4c.rlib(pecoff.o):./vendor/backtrace-sys/src/libbacktrace/pecoff.c:929: more undefined references to `__stack_chk_fail' follow
          collect2: error: ld returned 1 exit status

Adding -lssp_nonshared -lssp into rustbuild's builder.rs as a patch gives me the following error:

  = note: "x86_64-w64-mingw32-gcc" "-fno-use-linker-plugin" "-Wl,--nxcompat" "-m64" "-nostartfiles" "/usr/x86_64-w64-mingw32/lib/dllcrt2.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2/lib/rustlib/x86_64-pc-windows-gnu/lib/rsbegin.o" "-L" "$PWD/build/x86_64-unknown-linux-gnu/stage2/lib/rustlib/x86_64-pc-windows-gnu/lib" "-L" "$PWD/build/x86_64-unknown-linux-gnu/stage2/lib/rustlib/x86_64-pc-windows-gnu/lib/self-contained" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.0.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.1.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.10.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.11.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.12.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.13.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.14.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.15.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.2.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.3.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.4.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.5.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.6.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.7.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.8.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.std.7wsrxuxn-cgu.9.rcgu.o" "-o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.dll" "-Wl,--version-script=/tmp/rustcQ8fEFU/list" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.gy76lupzofoxc6f.rcgu.o" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/std-f849842eec509894.14pxj9r50qad4vso.rcgu.o" "-shared" "-Wl,--out-implib,$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps/libstd-f849842eec509894.dll.a" "-nodefaultlibs" "-L" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/deps" "-L" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/release/deps" "-L" "$PWD/build/x86_64-unknown-linux-gnu/stage2-std/x86_64-pc-windows-gnu/release/build/backtrace-sys-73393a103395095f/out" "-L" "$PWD/build/x86_64-unknown-linux-gnu/stage2/lib/rustlib/x86_64-pc-windows-gnu/lib" "-ladvapi32" "-lws2_32" "-luserenv" "-Wl,-Bstatic" "-Wl,--whole-archive" "/tmp/rustcQ8fEFU/libpanic_unwind-9c93af3a21bf779f.rlib" "-Wl,--no-whole-archive" "-Wl,--whole-archive" "/tmp/rustcQ8fEFU/libhashbrown-951231d947810b4e.rlib" "-Wl,--no-whole-archive" "-Wl,--whole-archive" "/tmp/rustcQ8fEFU/librustc_std_workspace_alloc-4397ecfaeb9d832e.rlib" "-Wl,--no-whole-archive" "-Wl,--whole-archive" "/tmp/rustcQ8fEFU/libbacktrace-4ceb221c1451fd72.rlib" "-Wl,--no-whole-archive" "-Wl,--whole-archive" "/tmp/rustcQ8fEFU/libbacktrace_sys-5ac9ad0bd2943e4c.rlib" "-Wl,--no-whole-archive" "-Wl,--whole-archive" "/tmp/rustcQ8fEFU/librustc_demangle-176970e988fbc465.rlib" "-Wl,--no-whole-archive" "-Wl,--whole-archive" "/tmp/rustcQ8fEFU/libunwind-204b2abdb5f7ae9a.rlib" "-Wl,--no-whole-archive" "-Wl,--whole-archive" "/tmp/rustcQ8fEFU/libcfg_if-b787a80b1cca0552.rlib" "-Wl,--no-whole-archive" "-Wl,--whole-archive" "/tmp/rustcQ8fEFU/liblibc-3072b25f7851b3d1.rlib" "-Wl,--no-whole-archive" "-Wl,--whole-archive" "/tmp/rustcQ8fEFU/liballoc-62d18a8976d7c133.rlib" "-Wl,--no-whole-archive" "-Wl,--whole-archive" "/tmp/rustcQ8fEFU/librustc_std_workspace_core-1b8ab73855770e4f.rlib" "-Wl,--no-whole-archive" "-Wl,--whole-archive" "/tmp/rustcQ8fEFU/libcore-bae6c7eaa8cff910.rlib" "-Wl,--no-whole-archive" "/tmp/rustcQ8fEFU/libcompiler_builtins-fa2917f0b54acfc4.rlib" "-lssp_nonshared" "-lssp" "-Wl,-Bdynamic" "-lmsvcrt" "-lmingwex" "-lmingw32" "-lmsvcrt" "-luser32" "-lkernel32" "-lgcc_s" "-lgcc" "-lkernel32" "$PWD/build/x86_64-unknown-linux-gnu/stage2/lib/rustlib/x86_64-pc-windows-gnu/lib/rsend.o"
  = note: /usr/bin/x86_64-w64-mingw32-ld: /usr/lib/gcc/x86_64-w64-mingw32/10-win32/libssp.a(ssp.o):(.text.startup+0x36): undefined reference to `__imp_CryptAcquireContextA'
          /usr/bin/x86_64-w64-mingw32-ld: /usr/lib/gcc/x86_64-w64-mingw32/10-win32/libssp.a(ssp.o):(.text.startup+0x63): undefined reference to `__imp_CryptGenRandom'
          /usr/bin/x86_64-w64-mingw32-ld: /usr/lib/gcc/x86_64-w64-mingw32/10-win32/libssp.a(ssp.o):(.text.startup+0x7e): undefined reference to `__imp_CryptReleaseContext'
          /usr/bin/x86_64-w64-mingw32-ld: /usr/lib/gcc/x86_64-w64-mingw32/10-win32/libssp.a(ssp.o):(.text.startup+0x86): undefined reference to `__imp_CryptReleaseContext'
          collect2: error: ld returned 1 exit status

I am using gcc-mingw-w64-x86-64-win32 with the win32 threading model, and CFLAGS and CXXFLAGS both contain -fstack-protector-strong.

$ x86_64-w64-mingw32-gcc --version
x86_64-w64-mingw32-gcc (GCC) 10-win32 20200525
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
infinity0 commented 4 years ago

It seems that adding -lssp to windows_gnu_base.rs in late_link_args works. This results in it being passed after -Wl,-Bdynamic which is what is needed. Adding -lssp simply to RUSTFLAGS puts it before any -Wl,-Bdynamic that rust adds, and I suppose we don't want to stick -Wl,-Bdynamic in RUSTFLAGS because it will affect both static and dynamic builds, and we can't switch it back afterwards.

Now -lssp is only needed if stack-protector is enabled. I'm not sure how to auto-detect this from windows_gnu_base.rs; for now I'm just hard-patching it into the Debian rustc.

infinity0 commented 4 years ago

To be clear, Debian enables stack protector via CFLAGS. This is picked up by the cc crate, when it compiles backtrace-sys etc, which makes its way into std thereby causing this failure.

mati865 commented 4 years ago

@infinity0 I think RUSTFLAGS=-Clink-arg=-lssp_nonshared -Clink-arg=-lsspshould work just fine. This issue is about missing libssp from rust-mingw component which affects only Windows hosts.

infinity0 commented 4 years ago

@mati865 it doesn't work for me. I am using Debian gcc-mingw not "rust-mingw".

infinity0 commented 4 years ago

To follow up, Debian's gcc-mingw does provide libssp, yet my build still fails with the RUSTFLAGS described. So I think merely having rust-mingw provide libssp would not be sufficient to get things working - you will probably run into what I described, and we'll have to patch windows_gnu_base.rs. Unless you (or someone else) has actually tried it?

infinity0 commented 4 years ago

This is what I'm doing:

--- a/src/librustc_target/spec/windows_gnu_base.rs
+++ b/src/librustc_target/spec/windows_gnu_base.rs
@@ -35,6 +35,8 @@
             "-lmsvcrt".to_string(),
             "-luser32".to_string(),
             "-lkernel32".to_string(),
+            "-lssp_nonshared".to_string(),
+            "-lssp".to_string(),
         ],
     );
     late_link_args_dynamic.insert(

In particular, adding -fstack-protector-strong here but omitting the -ls seems not to work.

Feasibly, we could set this only if either CFLAGS or CXXFLAGS contains "stack-protector", and omit it otherwise. The cc crate checks these envvars so I don't think it's that bad here either.

After doing this, I can successfully cross-compile a simple hello-world program from gnu/linux to windows, then run it via wine.

$ WINEPATH="/usr/lib/gcc/x86_64-w64-mingw32/10-win32;/usr/lib/rustlib/x86_64-pc-windows-gnu/lib" wine ./test.exe 
hello, world!
mati865 commented 4 years ago

@infinity0 I have not tried -fstack-protector with Rust but it appears to require advapi32 library so this should work: RUSTFLAGS="-Clink-arg=-lssp_nonshared -Clink-arg=-lssp -ladvapi32". I have no idea how late_link_args_dynamic pulled that library when you added libssp libs to late_link_args.

rust-mingw component is only available for windows-gnu host so it doesn't matter for cross compiling from Linux.

infinity0 commented 4 years ago

@mati865 Ah, it might just be the difference between linking against static vs dynamic libraries. The main difference between RUSTFLAGS and late_link_args is that RUSTFLAGS comes earlier in the eventual CLI invocation to *-ld. In particular it seems late_link_args comes after a -Bdynamic flag. So then only the direct dependencies have to be linked, rather than all the transitive dependencies which would include -ladvapi32 assuming you are correct. (I am guessing this explanation based on what I've seen so far, including the *-ld invocation, but didn't investigate deeper for 100% confirmation.) My patch works for my use-case for now anyway, it even builds cargo.exe fine and I can run it through WINE.