diff --git a/.changes/986.json b/.changes/986.json new file mode 100644 index 000000000..d89dcc23e --- /dev/null +++ b/.changes/986.json @@ -0,0 +1,5 @@ +{ + "type": "fixed", + "description": "always link to libgcc with musl targets to patch missing rust compiler builtins.", + "issues": [367, 906, 985] +} diff --git a/docker/Dockerfile.aarch64-unknown-linux-musl b/docker/Dockerfile.aarch64-unknown-linux-musl index c6a2e72f5..257857e85 100644 --- a/docker/Dockerfile.aarch64-unknown-linux-musl +++ b/docker/Dockerfile.aarch64-unknown-linux-musl @@ -20,11 +20,12 @@ ENV CROSS_MUSL_SYSROOT=/usr/local/aarch64-linux-musl COPY musl-symlink.sh / RUN /musl-symlink.sh $CROSS_MUSL_SYSROOT aarch64 -COPY aarch64-linux-musl-gcc.sh /usr/bin/ +COPY musl-linker.sh /usr/bin/ COPY qemu-runner / -ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER=aarch64-linux-musl-gcc.sh \ +ENV CROSS_TARGET_LINKER=aarch64-linux-musl-gcc \ + CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER=musl-linker.sh \ CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_RUNNER="/qemu-runner aarch64" \ CC_aarch64_unknown_linux_musl=aarch64-linux-musl-gcc \ CXX_aarch64_unknown_linux_musl=aarch64-linux-musl-g++ \ diff --git a/docker/Dockerfile.arm-unknown-linux-musleabi b/docker/Dockerfile.arm-unknown-linux-musleabi index 9a30522d0..4075ff027 100644 --- a/docker/Dockerfile.arm-unknown-linux-musleabi +++ b/docker/Dockerfile.arm-unknown-linux-musleabi @@ -24,9 +24,12 @@ ENV CROSS_MUSL_SYSROOT=/usr/local/arm-linux-musleabi COPY musl-symlink.sh / RUN /musl-symlink.sh $CROSS_MUSL_SYSROOT arm +COPY musl-linker.sh /usr/bin/ + COPY qemu-runner / -ENV CARGO_TARGET_ARM_UNKNOWN_LINUX_MUSLEABI_LINKER=arm-linux-musleabi-gcc \ +ENV CROSS_TARGET_LINKER=arm-linux-musleabi-gcc \ + CARGO_TARGET_ARM_UNKNOWN_LINUX_MUSLEABI_LINKER=musl-linker.sh \ CARGO_TARGET_ARM_UNKNOWN_LINUX_MUSLEABI_RUNNER="/qemu-runner arm" \ CC_arm_unknown_linux_musleabi=arm-linux-musleabi-gcc \ CXX_arm_unknown_linux_musleabi=arm-linux-musleabi-g++ \ diff --git a/docker/Dockerfile.arm-unknown-linux-musleabihf b/docker/Dockerfile.arm-unknown-linux-musleabihf index da47f173f..e6d1c37b1 100644 --- a/docker/Dockerfile.arm-unknown-linux-musleabihf +++ b/docker/Dockerfile.arm-unknown-linux-musleabihf @@ -25,9 +25,12 @@ ENV CROSS_MUSL_SYSROOT=/usr/local/arm-linux-musleabihf COPY musl-symlink.sh / RUN /musl-symlink.sh $CROSS_MUSL_SYSROOT armhf +COPY musl-linker.sh /usr/bin/ + COPY qemu-runner / -ENV CARGO_TARGET_ARM_UNKNOWN_LINUX_MUSLEABIHF_LINKER=arm-linux-musleabihf-gcc \ +ENV CROSS_TARGET_LINKER=arm-linux-musleabihf-gcc \ + CARGO_TARGET_ARM_UNKNOWN_LINUX_MUSLEABIHF_LINKER=musl-linker.sh \ CARGO_TARGET_ARM_UNKNOWN_LINUX_MUSLEABIHF_RUNNER="/qemu-runner arm" \ CC_arm_unknown_linux_musleabihf=arm-linux-musleabihf-gcc \ CXX_arm_unknown_linux_musleabihf=arm-linux-musleabihf-g++ \ diff --git a/docker/Dockerfile.armv5te-unknown-linux-musleabi b/docker/Dockerfile.armv5te-unknown-linux-musleabi index b4c300af1..8ddfd5cce 100644 --- a/docker/Dockerfile.armv5te-unknown-linux-musleabi +++ b/docker/Dockerfile.armv5te-unknown-linux-musleabi @@ -24,9 +24,12 @@ ENV CROSS_MUSL_SYSROOT=/usr/local/arm-linux-musleabi COPY musl-symlink.sh / RUN /musl-symlink.sh $CROSS_MUSL_SYSROOT arm +COPY musl-linker.sh /usr/bin/ + COPY qemu-runner / -ENV CARGO_TARGET_ARMV5TE_UNKNOWN_LINUX_MUSLEABI_LINKER=arm-linux-musleabi-gcc \ +ENV CROSS_TARGET_LINKER=arm-linux-musleabi-gcc \ + CARGO_TARGET_ARMV5TE_UNKNOWN_LINUX_MUSLEABI_LINKER=musl-linker.sh \ CARGO_TARGET_ARMV5TE_UNKNOWN_LINUX_MUSLEABI_RUNNER="/qemu-runner arm" \ CC_armv5te_unknown_linux_musleabi=arm-linux-musleabi-gcc \ CXX_armv5te_unknown_linux_musleabi=arm-linux-musleabi-g++ \ diff --git a/docker/Dockerfile.armv7-unknown-linux-musleabi b/docker/Dockerfile.armv7-unknown-linux-musleabi index 05d129b5c..883cc8977 100644 --- a/docker/Dockerfile.armv7-unknown-linux-musleabi +++ b/docker/Dockerfile.armv7-unknown-linux-musleabi @@ -25,9 +25,12 @@ ENV CROSS_MUSL_SYSROOT=/usr/local/arm-linux-musleabi COPY musl-symlink.sh / RUN /musl-symlink.sh $CROSS_MUSL_SYSROOT arm +COPY musl-linker.sh /usr/bin/ + COPY qemu-runner / -ENV CARGO_TARGET_ARMV7_UNKNOWN_LINUX_MUSLEABI_LINKER=arm-linux-musleabi-gcc \ +ENV CROSS_TARGET_LINKER=arm-linux-musleabi-gcc \ + CARGO_TARGET_ARMV7_UNKNOWN_LINUX_MUSLEABI_LINKER=musl-linker.sh \ CARGO_TARGET_ARMV7_UNKNOWN_LINUX_MUSLEABI_RUNNER="/qemu-runner armv7" \ CC_armv7_unknown_linux_musleabi=arm-linux-musleabi-gcc \ CXX_armv7_unknown_linux_musleabi=arm-linux-musleabi-g++ \ diff --git a/docker/Dockerfile.armv7-unknown-linux-musleabihf b/docker/Dockerfile.armv7-unknown-linux-musleabihf index 3742465d4..80b7adf2d 100644 --- a/docker/Dockerfile.armv7-unknown-linux-musleabihf +++ b/docker/Dockerfile.armv7-unknown-linux-musleabihf @@ -25,9 +25,12 @@ ENV CROSS_MUSL_SYSROOT=/usr/local/arm-linux-musleabihf COPY musl-symlink.sh / RUN /musl-symlink.sh $CROSS_MUSL_SYSROOT armhf +COPY musl-linker.sh /usr/bin/ + COPY qemu-runner / -ENV CARGO_TARGET_ARMV7_UNKNOWN_LINUX_MUSLEABIHF_LINKER=arm-linux-musleabihf-gcc \ +ENV CROSS_TARGET_LINKER=arm-linux-musleabihf-gcc \ + CARGO_TARGET_ARMV7_UNKNOWN_LINUX_MUSLEABIHF_LINKER=musl-linker.sh \ CARGO_TARGET_ARMV7_UNKNOWN_LINUX_MUSLEABIHF_RUNNER="/qemu-runner armv7" \ CC_armv7_unknown_linux_musleabihf=arm-linux-musleabihf-gcc \ CXX_armv7_unknown_linux_musleabihf=arm-linux-musleabihf-g++ \ diff --git a/docker/Dockerfile.i586-unknown-linux-musl b/docker/Dockerfile.i586-unknown-linux-musl index d33620eba..5e33b0686 100644 --- a/docker/Dockerfile.i586-unknown-linux-musl +++ b/docker/Dockerfile.i586-unknown-linux-musl @@ -20,9 +20,12 @@ ENV CROSS_MUSL_SYSROOT=/usr/local/i586-linux-musl COPY musl-symlink.sh / RUN /musl-symlink.sh $CROSS_MUSL_SYSROOT i386 +COPY musl-linker.sh /usr/bin/ + COPY qemu-runner / -ENV CARGO_TARGET_I586_UNKNOWN_LINUX_MUSL_LINKER=i586-linux-musl-gcc \ +ENV CROSS_TARGET_LINKER=i586-linux-musl-gcc \ + CARGO_TARGET_I586_UNKNOWN_LINUX_MUSL_LINKER=musl-linker.sh \ CARGO_TARGET_I586_UNKNOWN_LINUX_MUSL_RUNNER="/qemu-runner i586" \ CC_i586_unknown_linux_musl=i586-linux-musl-gcc \ CXX_i586_unknown_linux_musl=i586-linux-musl-g++ \ diff --git a/docker/Dockerfile.i686-unknown-linux-musl b/docker/Dockerfile.i686-unknown-linux-musl index 0229684da..6c99e7093 100644 --- a/docker/Dockerfile.i686-unknown-linux-musl +++ b/docker/Dockerfile.i686-unknown-linux-musl @@ -20,9 +20,12 @@ ENV CROSS_MUSL_SYSROOT=/usr/local/i686-linux-musl COPY musl-symlink.sh / RUN /musl-symlink.sh $CROSS_MUSL_SYSROOT i386 +COPY musl-linker.sh /usr/bin/ + COPY qemu-runner / -ENV CARGO_TARGET_I686_UNKNOWN_LINUX_MUSL_LINKER=i686-linux-musl-gcc \ +ENV CROSS_TARGET_LINKER=i686-linux-musl-gcc \ + CARGO_TARGET_I686_UNKNOWN_LINUX_MUSL_LINKER=musl-linker.sh \ CARGO_TARGET_I686_UNKNOWN_LINUX_MUSL_RUNNER="/qemu-runner i686" \ CC_i686_unknown_linux_musl=i686-linux-musl-gcc \ CXX_i686_unknown_linux_musl=i686-linux-musl-g++ \ diff --git a/docker/Dockerfile.mips-unknown-linux-musl b/docker/Dockerfile.mips-unknown-linux-musl index 4ae946ad0..41bf02da9 100644 --- a/docker/Dockerfile.mips-unknown-linux-musl +++ b/docker/Dockerfile.mips-unknown-linux-musl @@ -22,9 +22,12 @@ ENV CROSS_MUSL_SYSROOT=/usr/local/mips-linux-muslsf COPY musl-symlink.sh / RUN /musl-symlink.sh $CROSS_MUSL_SYSROOT mips-sf +COPY musl-linker.sh /usr/bin/ + COPY qemu-runner / -ENV CARGO_TARGET_MIPS_UNKNOWN_LINUX_MUSL_LINKER=mips-linux-muslsf-gcc \ +ENV CROSS_TARGET_LINKER=mips-linux-muslsf-gcc \ + CARGO_TARGET_MIPS_UNKNOWN_LINUX_MUSL_LINKER=musl-linker.sh \ CARGO_TARGET_MIPS_UNKNOWN_LINUX_MUSL_RUNNER="/qemu-runner mips" \ CC_mips_unknown_linux_musl=mips-linux-muslsf-gcc \ CXX_mips_unknown_linux_musl=mips-linux-muslsf-g++ \ diff --git a/docker/Dockerfile.mips64-unknown-linux-muslabi64 b/docker/Dockerfile.mips64-unknown-linux-muslabi64 index 7fbecfcd0..fe154a63d 100644 --- a/docker/Dockerfile.mips64-unknown-linux-muslabi64 +++ b/docker/Dockerfile.mips64-unknown-linux-muslabi64 @@ -25,11 +25,12 @@ RUN mkdir -p $CROSS_MUSL_SYSROOT/usr/lib64 RUN ln -s $CROSS_MUSL_SYSROOT/usr/lib/libc.so $CROSS_MUSL_SYSROOT/usr/lib64/libc.so RUN ln -s $CROSS_MUSL_SYSROOT/usr/lib/libc.so.1 $CROSS_MUSL_SYSROOT/usr/lib64/libc.so.1 -COPY mips64-linux-muslabi64-gcc.sh /usr/bin/ +COPY musl-linker.sh /usr/bin/ COPY qemu-runner / -ENV CARGO_TARGET_MIPS64_UNKNOWN_LINUX_MUSLABI64_LINKER=mips64-linux-muslabi64-gcc.sh \ +ENV CROSS_TARGET_LINKER=mips64-linux-musl-gcc \ + CARGO_TARGET_MIPS64_UNKNOWN_LINUX_MUSLABI64_LINKER=musl-linker.sh \ CARGO_TARGET_MIPS64_UNKNOWN_LINUX_MUSLABI64_RUNNER="/qemu-runner mips64" \ CC_mips64_unknown_linux_muslabi64=mips64-linux-musl-gcc \ CXX_mips64_unknown_linux_muslabi64=mips64-linux-musl-g++ \ diff --git a/docker/Dockerfile.mips64el-unknown-linux-muslabi64 b/docker/Dockerfile.mips64el-unknown-linux-muslabi64 index f3134cfdb..c274674c7 100644 --- a/docker/Dockerfile.mips64el-unknown-linux-muslabi64 +++ b/docker/Dockerfile.mips64el-unknown-linux-muslabi64 @@ -21,9 +21,12 @@ ENV CROSS_MUSL_SYSROOT=/usr/local/mips64el-linux-muslsf COPY musl-symlink.sh / RUN /musl-symlink.sh $CROSS_MUSL_SYSROOT mips64el-sf +COPY musl-linker.sh /usr/bin/ + COPY qemu-runner / -ENV CARGO_TARGET_MIPS64EL_UNKNOWN_LINUX_MUSLABI64_LINKER=mips64el-linux-muslsf-gcc \ +ENV CROSS_TARGET_LINKER=mips64el-linux-muslsf-gcc \ + CARGO_TARGET_MIPS64EL_UNKNOWN_LINUX_MUSLABI64_LINKER=musl-linker.sh \ CARGO_TARGET_MIPS64EL_UNKNOWN_LINUX_MUSLABI64_RUNNER="/qemu-runner mips64el" \ CC_mips64el_unknown_linux_muslabi64=mips64el-linux-muslsf-gcc \ CXX_mips64el_unknown_linux_muslabi64=mips64el-linux-muslsf-g++ \ diff --git a/docker/Dockerfile.mipsel-unknown-linux-musl b/docker/Dockerfile.mipsel-unknown-linux-musl index 2590c2307..411dc70ee 100644 --- a/docker/Dockerfile.mipsel-unknown-linux-musl +++ b/docker/Dockerfile.mipsel-unknown-linux-musl @@ -22,9 +22,12 @@ ENV CROSS_MUSL_SYSROOT=/usr/local/mipsel-linux-muslsf COPY musl-symlink.sh / RUN /musl-symlink.sh $CROSS_MUSL_SYSROOT mipsel-sf +COPY musl-linker.sh /usr/bin/ + COPY qemu-runner / -ENV CARGO_TARGET_MIPSEL_UNKNOWN_LINUX_MUSL_LINKER=mipsel-linux-muslsf-gcc \ +ENV CROSS_TARGET_LINKER=mipsel-linux-muslsf-gcc \ + CARGO_TARGET_MIPSEL_UNKNOWN_LINUX_MUSL_LINKER=musl-linker.sh \ CARGO_TARGET_MIPSEL_UNKNOWN_LINUX_MUSL_RUNNER="/qemu-runner mipsel" \ CC_mipsel_unknown_linux_musl=mipsel-linux-muslsf-gcc \ CXX_mipsel_unknown_linux_musl=mipsel-linux-muslsf-g++ \ diff --git a/docker/Dockerfile.x86_64-unknown-linux-musl b/docker/Dockerfile.x86_64-unknown-linux-musl index 1e99b626f..3e9ee4ce8 100644 --- a/docker/Dockerfile.x86_64-unknown-linux-musl +++ b/docker/Dockerfile.x86_64-unknown-linux-musl @@ -20,9 +20,12 @@ ENV CROSS_MUSL_SYSROOT=/usr/local/x86_64-linux-musl COPY musl-symlink.sh / RUN /musl-symlink.sh $CROSS_MUSL_SYSROOT x86_64 +COPY musl-linker.sh /usr/bin/ + COPY qemu-runner / -ENV CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_LINKER=x86_64-linux-musl-gcc \ +ENV CROSS_TARGET_LINKER=x86_64-linux-musl-gcc \ + CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_LINKER=musl-linker.sh \ CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_RUNNER="/qemu-runner x86_64" \ CC_x86_64_unknown_linux_musl=x86_64-linux-musl-gcc \ CXX_x86_64_unknown_linux_musl=x86_64-linux-musl-g++ \ diff --git a/docker/aarch64-linux-musl-gcc.sh b/docker/aarch64-linux-musl-gcc.sh deleted file mode 100755 index 8cfe320db..000000000 --- a/docker/aarch64-linux-musl-gcc.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -# this linker wrapper works around issue https://github.com/rust-lang/rust/issues/46651 -# which affects toolchains older than 1.48 -# older toolchains require the `-lgcc` linker flag otherwise they fail to link - -set -x -set -euo pipefail - -main() { - local release= - release=$(rustc -Vv | grep '^release:' | cut -d ':' -f2) - # NOTE we assume `major` is always "1" - local minor= - minor=$(echo "$release" | cut -d '.' -f2) - - if (( minor >= 48 )); then - # no workaround - aarch64-linux-musl-gcc "${@}" - else - # apply workaround - aarch64-linux-musl-gcc "${@}" -lgcc - fi -} - -main "${@}" diff --git a/docker/mips64-linux-muslabi64-gcc.sh b/docker/mips64-linux-muslabi64-gcc.sh deleted file mode 100755 index a26afa9f3..000000000 --- a/docker/mips64-linux-muslabi64-gcc.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -# this fixes an issue of missing symbols from the command lines -# these soft-float routines are required even for hard-float targets. -# (strtod.lo): undefined reference to symbol '__trunctfsf2@@GCC_3.0' - -set -x -set -euo pipefail - -main() { - if [[ $# -gt 0 ]]; then - exec mips64-linux-musl-gcc "${@}" -lgcc -static-libgcc - else - exec mips64-linux-musl-gcc "${@}" - fi -} - -main "${@}" diff --git a/docker/musl-linker.sh b/docker/musl-linker.sh new file mode 100755 index 000000000..d3f5a47c8 --- /dev/null +++ b/docker/musl-linker.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# this fixes a series of issues affecting musl targets, with missing +# instrinsics that are symbols present in libgcc but not in the compiler +# builtins. this is therefore a temporary workaround until these +# issues are fixed. example issues previously discovered are noted below: + +# mips64-unknown-linux-musl +# this linker wrapper works around issue https://github.com/rust-lang/rust/issues/46651 +# which affects toolchains older than 1.48 +# older toolchains require the `-lgcc` linker flag otherwise they fail to link + +# mips64-unknown-linux-gnuabi64 +# this fixes an issue of missing symbols from the command lines +# these soft-float routines are required even for hard-float targets. +# (strtod.lo): undefined reference to symbol '__trunctfsf2@@GCC_3.0' + +set -eo + +main() { + if [[ -n "${CROSS_NO_LIBGCC_ROUTINES}" ]] || [[ $# -eq 0 ]]; then + exec "${CROSS_TARGET_LINKER}" "${@}" + else + exec "${CROSS_TARGET_LINKER}" "${@}" -lgcc -static-libgcc + fi +} + +main "${@}" diff --git a/src/docker/shared.rs b/src/docker/shared.rs index 9fb7675b5..95e7d7e5a 100644 --- a/src/docker/shared.rs +++ b/src/docker/shared.rs @@ -530,12 +530,11 @@ pub(crate) fn docker_envvars( docker.args(&["-e", &format!("USER={username}")]); } - if let Ok(value) = env::var("QEMU_STRACE") { - docker.args(&["-e", &format!("QEMU_STRACE={value}")]); - } - - if let Ok(value) = env::var("CROSS_DEBUG") { - docker.args(&["-e", &format!("CROSS_DEBUG={value}")]); + let extras = ["QEMU_STRACE", "CROSS_DEBUG", "CROSS_NO_LIBGCC_ROUTINES"]; + for extra in extras { + if let Ok(value) = env::var(extra) { + docker.args(&["-e", &format!("{extra}={value}")]); + } } if let Ok(value) = env::var("CROSS_CONTAINER_OPTS") {