Skip to content

under latest MinGW, cannot link with C code using stdout #47048

Closed

Description

@tspiteri

I'm having an issue under MinGW and I'm not sure if it's a MinGW issue or a rustc issue. On the one hand the bug crops up after an update to two MinGW packages, but on the other hand I cannot reproduce with only C, and I don't know if rustc is using MinGW in some undocumented unsupported way.

say_hi.c:

#include <stdio.h>
void say_hi(void) {
    fprintf(stdout, "hi!\n");
}

c_main.c

void say_hi(void);
int main(void) {
    say_hi();
    return 0;
}

r_main.rs:

extern "C" {
    fn say_hi();
}
fn main() {
    unsafe {
        say_hi();
    }
}

Under the latest MinGW, specifically with packages

  • mingw-w64-x86_64-crt-git-6.0.0.5066.61efe559-1 and
  • mingw-w64-x86_64-headers-git-6.0.0.5066.61efe559-1,

using only gcc like this works:

$ gcc -c say_hi.c
$ ar cr libsay_hi.a say_hi.o
$ gcc c_main.c -L. -lsay_hi -o c_main.exe && ./c_main.exe
hi!

But it doesn't work with rustc:

$ gcc -c say_hi.c
$ ar cr libsay_hi.a say_hi.o
$ rustc r_main.rs -L. -lsay_hi -o r_main.exe && ./r_main.exe
error: linking with `gcc` failed: exit code: 1
  |
  = note: "gcc" "-Wl,--enable-long-section-names" "-fno-use-linker-plugin" "-Wl,--nxcompat" "-nostdlib" "-m64" "C:\\Users\\Trevor\\.rustup\\toolchains\\stable-x86_64-pc-windows-gnu\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\crt2.o" "C:\\Users\\Trevor\\.rustup\\toolchains\\stable-x86_64-pc-windows-gnu\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\rsbegin.o" "-L" "C:\\Users\\Trevor\\.rustup\\toolchains\\stable-x86_64-pc-windows-gnu\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib" "r_main.r_main0.rust-cgu.o" "-o" "r_main.exe" "r_main.crate.allocator.rust-cgu.o" "-Wl,--gc-sections" "-nodefaultlibs" "-L" "." "-L" "C:\\Users\\Trevor\\.rustup\\toolchains\\stable-x86_64-pc-windows-gnu\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib" "-l" "say_hi" "-Wl,-Bstatic" "C:\\Users\\Trevor\\.rustup\\toolchains\\stable-x86_64-pc-windows-gnu\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\libstd-60d4a252bdda9250.rlib" "C:\\Users\\Trevor\\.rustup\\toolchains\\stable-x86_64-pc-windows-gnu\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\liballoc_system-a05404e5e059417a.rlib" "C:\\Users\\Trevor\\.rustup\\toolchains\\stable-x86_64-pc-windows-gnu\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\librand-81cbf6f1d5a19206.rlib" "C:\\Users\\Trevor\\.rustup\\toolchains\\stable-x86_64-pc-windows-gnu\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\libpanic_unwind-0b63e20460046692.rlib" "C:\\Users\\Trevor\\.rustup\\toolchains\\stable-x86_64-pc-windows-gnu\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\liballoc-f824a78e715239af.rlib" "C:\\Users\\Trevor\\.rustup\\toolchains\\stable-x86_64-pc-windows-gnu\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\libstd_unicode-2abaea46f194a6e1.rlib" "C:\\Users\\Trevor\\.rustup\\toolchains\\stable-x86_64-pc-windows-gnu\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\libunwind-7daa32005d584d8a.rlib" "C:\\Users\\Trevor\\.rustup\\toolchains\\stable-x86_64-pc-windows-gnu\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\liblibc-49ff25caaa6e945f.rlib" "C:\\Users\\Trevor\\.rustup\\toolchains\\stable-x86_64-pc-windows-gnu\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\libcore-f2bd2d524c6ace24.rlib" "C:\\Users\\Trevor\\.rustup\\toolchains\\stable-x86_64-pc-windows-gnu\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\libcompiler_builtins-c6139fac5e899293.rlib" "-Wl,-Bdynamic" "-l" "advapi32" "-l" "ws2_32" "-l" "userenv" "-l" "shell32" "-Wl,-Bstatic" "-l" "gcc_eh" "-l" "pthread" "-Wl,-Bdynamic" "-lmingwex" "-lmingw32" "-lgcc" "-lmsvcrt" "-luser32" "-lkernel32" "C:\\Users\\Trevor\\.rustup\\toolchains\\stable-x86_64-pc-windows-gnu\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\rsend.o"
  = note: ./libsay_hi.a(say_hi.o):say_hi.c:(.text+0x10): undefined reference to `__imp___acrt_iob_func'
          

error: aborting due to previous error

If I downgrade those two packages to

  • mingw-w64-x86_64-crt-git-5.0.0.5002.34a7c1c0-1 and
  • mingw-w64-x86_64-headers-git-5.0.0.5002.34a7c1c0-1,

it works with rustc too:

$ gcc -c say_hi.c
$ ar cr libsay_hi.a say_hi.o
$ rustc r_main.rs -L. -lsay_hi -o r_main.exe && ./r_main.exe
hi!

One last thing, if I compile the library using the old packages, and then upgrade the packages, both gcc c_main.c ... and rustc r_main.rs ... work. If I compile the library using the new packages, and then downgrade the packages, both gcc c_main.c ... and rustc r_main.rs ... fail.

Activity

  1. mati865 commented on Dec 29, 2017

    @mati865
    Member

    Mingw-w64 seen some huge changes lately, if recompiling Rust with latest mingw-w64 doesn't work or still gives errors like that then it's probably a regression they introduced.

  2. cretz commented on Feb 4, 2018

    @cretz

    Got anyone else arriving here across the web w/ new MinGW breaks, in addition to:

    pacman -U /var/cache/pacman/pkg/mingw-w64-x86_64-crt-git-5.0.0.4745.d2384c2-1-any.pkg.tar.xz
    pacman -U /var/cache/pacman/pkg/mingw-w64-x86_64-headers-git-5.0.0.4747.0f8f626-1-any.pkg.tar.xz
    

    You might also need to downgrade winpthreads (granted your version numbers may be different):

    pacman -U /var/cache/pacman/pkg/mingw-w64-x86_64-winpthreads-git-5.0.0.4741.2c8939a-1-any.pkg.tar.xz /var/cache/pacman/pkg/mingw-w64-x86_64-libwinpthread-git-5.0.0.4741.2c8939a-1-any.pkg.tar.xz
    

    Had to do both at once due to codeps. I ran into this Rust+MinGW issue when statically building latest Tor and deps w/ latest MinGW.

  3. tspiteri commented on Feb 5, 2018

    @tspiteri
    ContributorAuthor

    The old packages are also available at http://repo.msys2.org/mingw/x86_64/, where you can download the latest versions of the packages in question that include git-5.0.0 in their version rather than the new incompatible git-6.0.0. This could be required for example on a new MinGW installation where there are no git-5.0.0 packages in /var/cache/pacman/pkg.

  4. lins05 commented on Feb 9, 2018

    @lins05

    Reached here by googling.

    @cretz thanks for the tip, it works

  5. mati865 commented on Mar 4, 2018

    @mati865
    Member

    Should be fixed with crt/headers packages in version 6.0.0.5114.b9400293. They are already available in the repository.

  6. tspiteri commented on Mar 5, 2018

    @tspiteri
    ContributorAuthor

    I upgraded to version 6.0.0.5114 and reproduced the issue. Downgrading to 5.0.0.5002 still works.

    (Keep in mind that if the library is built using 5.0.0.5002, linking will work using 6.0.0.*.)

  7. mati865 commented on Mar 5, 2018

    @mati865
    Member

    Similar issue was fixed recently https://github.com/Alexpux/MINGW-packages/issues/3469.

    Maybe rust internals have to be recompiled.

  8. NovemberZulu commented on Mar 31, 2018

    @NovemberZulu
    Contributor

    Still happens for with rustc 1.25.0 (package in question is cargo-update). May be Rust build machine has older MinGW?

  9. mati865 commented on Mar 31, 2018

    @mati865
    Member

    Yeah, I just forgot that Rust is using mingw-w64-builds toolchain which is still based on 5.x mingw-w64 releases.
    That basically makes official Rust unusable within MSYS2.

  10. NovemberZulu commented on Mar 31, 2018

    @NovemberZulu
    Contributor

    The build instructions for for windows-gnu specifically suggest using MSYS2 :( . Could you please elaborate a bit about that mingw-w64-builds toolchain?

  11. mati865 commented on Mar 31, 2018

    @mati865
    Member

    Bundling /mingw64/x86_64-w64-mingw32/lib/libcrtdll.a from MSYS2 toolchain could help but somebody would have to test it properly.

    Could you please elaborate a bit about that mingw-w64-builds toolchain?

    https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/

  12. NovemberZulu commented on Mar 31, 2018

    @NovemberZulu
    Contributor

    I looked around the link, and it seems that master already has __acrt_iob_func, but v5.x does not. I wasnot able to find any kind of roadmap or ETA for v6.x release.

  13. NovemberZulu commented on Apr 1, 2018

    @NovemberZulu
    Contributor

    I built current Rust master using MSYS2, as described in README, and now I am able to build cargo-update without tinkering with include files. May be switching the official builds to MSYS2 is an option?

  14. 83 remaining items

  15. bs2kbs2k commented on Aug 8, 2020

    @bs2kbs2k

    I solved this issue by running

    pacman -U https://archive.org/download/archlinux_pkg_mingw-w64-crt/mingw-w64-crt-5.0.0-1-any.pkg.tar.xz https://archive.org/download/archlinux_pkg_mingw-w64-headers/mingw-w64-headers-5.0.0-1-any.pkg.tar.xz https://archive.org/download/archlinux_pkg_mingw-w64-winpthreads/mingw-w64-winpthreads-5.0.0-1-any.pkg.tar.xz

    to downgrade those 3 packages on archlinux.

  16. Shoeboxam commented on Sep 2, 2021

    @Shoeboxam

    I was running into this same issue on rust 1.54 while attempting to build @tspiteri's gmp-mpfr-sys crate. I was able to build within the windows-latest Github actions environment on 2021-8-3 thanks to this comment.

    The build was failing again when I cut the next release on 2021-8-31. I resolved it by adjusting the command to:

    cp -f /mingw64/x86_64-w64-mingw32/lib/{*.a,*.o} `rustc --print sysroot`/lib/rustlib/x86_64-pc-windows-gnu/lib/self-contained
    

    This raises two questions:

    1. What caused the change to the path?
    2. I understand this issue has been closed by windows-gnu: prefer system crt libraries if they are available #67429, but rust is still unable to find the relevant binaries. What change do I need to make to the system so that rust can find these binaries on its own?
  17. mati865 commented on Sep 2, 2021

    @mati865
    Member

    What caused the change to the path?

    #72999

    I understand this issue has been closed by windows-gnu: prefer system crt libraries if they are available #67429, but rust is still unable to find the relevant binaries. What change do I need to make to the system so that rust can find these binaries on its own?

    This is the first report I see since this issue was closed. There should be no change required as long as the compiler is available in PATH. If this doesn't automatically work then it's new bug and could be worked around with RUSTFLAGS=-C link-self-contained=no.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

A-linkageArea: linking into static, shared libraries and binariesC-bugCategory: This is a bug.O-windows-gnuToolchain: GNU, Operating system: WindowsP-highHigh priorityT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions