Skip to content

Always link to libgcc for musl targets. #986

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changes/986.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"type": "fixed",
"description": "always link to libgcc with musl targets to patch missing rust compiler builtins.",
"issues": [367, 906, 985]
}
5 changes: 3 additions & 2 deletions docker/Dockerfile.aarch64-unknown-linux-musl
Original file line number Diff line number Diff line change
Expand Up @@ -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++ \
Expand Down
5 changes: 4 additions & 1 deletion docker/Dockerfile.arm-unknown-linux-musleabi
Original file line number Diff line number Diff line change
Expand Up @@ -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++ \
Expand Down
5 changes: 4 additions & 1 deletion docker/Dockerfile.arm-unknown-linux-musleabihf
Original file line number Diff line number Diff line change
Expand Up @@ -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++ \
Expand Down
5 changes: 4 additions & 1 deletion docker/Dockerfile.armv5te-unknown-linux-musleabi
Original file line number Diff line number Diff line change
Expand Up @@ -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++ \
Expand Down
5 changes: 4 additions & 1 deletion docker/Dockerfile.armv7-unknown-linux-musleabi
Original file line number Diff line number Diff line change
Expand Up @@ -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++ \
Expand Down
5 changes: 4 additions & 1 deletion docker/Dockerfile.armv7-unknown-linux-musleabihf
Original file line number Diff line number Diff line change
Expand Up @@ -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++ \
Expand Down
5 changes: 4 additions & 1 deletion docker/Dockerfile.i586-unknown-linux-musl
Original file line number Diff line number Diff line change
Expand Up @@ -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++ \
Expand Down
5 changes: 4 additions & 1 deletion docker/Dockerfile.i686-unknown-linux-musl
Original file line number Diff line number Diff line change
Expand Up @@ -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++ \
Expand Down
5 changes: 4 additions & 1 deletion docker/Dockerfile.mips-unknown-linux-musl
Original file line number Diff line number Diff line change
Expand Up @@ -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++ \
Expand Down
5 changes: 3 additions & 2 deletions docker/Dockerfile.mips64-unknown-linux-muslabi64
Original file line number Diff line number Diff line change
Expand Up @@ -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++ \
Expand Down
5 changes: 4 additions & 1 deletion docker/Dockerfile.mips64el-unknown-linux-muslabi64
Original file line number Diff line number Diff line change
Expand Up @@ -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++ \
Expand Down
5 changes: 4 additions & 1 deletion docker/Dockerfile.mipsel-unknown-linux-musl
Original file line number Diff line number Diff line change
Expand Up @@ -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++ \
Expand Down
5 changes: 4 additions & 1 deletion docker/Dockerfile.x86_64-unknown-linux-musl
Original file line number Diff line number Diff line change
Expand Up @@ -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++ \
Expand Down
26 changes: 0 additions & 26 deletions docker/aarch64-linux-musl-gcc.sh

This file was deleted.

18 changes: 0 additions & 18 deletions docker/mips64-linux-muslabi64-gcc.sh

This file was deleted.

28 changes: 28 additions & 0 deletions docker/musl-linker.sh
Original file line number Diff line number Diff line change
@@ -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 "${@}"
11 changes: 5 additions & 6 deletions src/docker/shared.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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") {
Expand Down