Skip to content

Commit 9ba59c0

Browse files
committed
Always link to libgcc for musl targets.
Fixes issues with numerous missing symbols from libgcc routines that are not currently implemented in Rust's compiler builtins. These include: - __trunctfsf2 - __ctzdi2 - __letf2 - __addtf3 These missing symbols all seem to be soft-float and integer arithmetic routines.
1 parent 678e3d7 commit 9ba59c0

17 files changed

+82
-59
lines changed

.changes/986.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"type": "fixed",
3+
"description": "always link to libgcc with musl targets to patch missing rust compiler builtins.",
4+
"issues": [906, 985]
5+
}

docker/Dockerfile.aarch64-unknown-linux-musl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,12 @@ ENV CROSS_MUSL_SYSROOT=/usr/local/aarch64-linux-musl
2020
COPY musl-symlink.sh /
2121
RUN /musl-symlink.sh $CROSS_MUSL_SYSROOT aarch64
2222

23-
COPY aarch64-linux-musl-gcc.sh /usr/bin/
23+
COPY musl-linker.sh /usr/bin/
2424

2525
COPY qemu-runner /
2626

27-
ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER=aarch64-linux-musl-gcc.sh \
27+
ENV CROSS_TARGET_LINKER=aarch64-linux-musl-gcc \
28+
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER=musl-linker.sh \
2829
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_RUNNER="/qemu-runner aarch64" \
2930
CC_aarch64_unknown_linux_musl=aarch64-linux-musl-gcc \
3031
CXX_aarch64_unknown_linux_musl=aarch64-linux-musl-g++ \

docker/Dockerfile.arm-unknown-linux-musleabi

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,12 @@ ENV CROSS_MUSL_SYSROOT=/usr/local/arm-linux-musleabi
2424
COPY musl-symlink.sh /
2525
RUN /musl-symlink.sh $CROSS_MUSL_SYSROOT arm
2626

27+
COPY musl-linker.sh /usr/bin/
28+
2729
COPY qemu-runner /
2830

29-
ENV CARGO_TARGET_ARM_UNKNOWN_LINUX_MUSLEABI_LINKER=arm-linux-musleabi-gcc \
31+
ENV CROSS_TARGET_LINKER=arm-linux-musleabi-gcc \
32+
CARGO_TARGET_ARM_UNKNOWN_LINUX_MUSLEABI_LINKER=musl-linker.sh \
3033
CARGO_TARGET_ARM_UNKNOWN_LINUX_MUSLEABI_RUNNER="/qemu-runner arm" \
3134
CC_arm_unknown_linux_musleabi=arm-linux-musleabi-gcc \
3235
CXX_arm_unknown_linux_musleabi=arm-linux-musleabi-g++ \

docker/Dockerfile.arm-unknown-linux-musleabihf

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,12 @@ ENV CROSS_MUSL_SYSROOT=/usr/local/arm-linux-musleabihf
2525
COPY musl-symlink.sh /
2626
RUN /musl-symlink.sh $CROSS_MUSL_SYSROOT armhf
2727

28+
COPY musl-linker.sh /usr/bin/
29+
2830
COPY qemu-runner /
2931

30-
ENV CARGO_TARGET_ARM_UNKNOWN_LINUX_MUSLEABIHF_LINKER=arm-linux-musleabihf-gcc \
32+
ENV CROSS_TARGET_LINKER=arm-linux-musleabihf-gcc \
33+
CARGO_TARGET_ARM_UNKNOWN_LINUX_MUSLEABIHF_LINKER=musl-linker.sh \
3134
CARGO_TARGET_ARM_UNKNOWN_LINUX_MUSLEABIHF_RUNNER="/qemu-runner arm" \
3235
CC_arm_unknown_linux_musleabihf=arm-linux-musleabihf-gcc \
3336
CXX_arm_unknown_linux_musleabihf=arm-linux-musleabihf-g++ \

docker/Dockerfile.armv5te-unknown-linux-musleabi

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,12 @@ ENV CROSS_MUSL_SYSROOT=/usr/local/arm-linux-musleabi
2424
COPY musl-symlink.sh /
2525
RUN /musl-symlink.sh $CROSS_MUSL_SYSROOT arm
2626

27+
COPY musl-linker.sh /usr/bin/
28+
2729
COPY qemu-runner /
2830

29-
ENV CARGO_TARGET_ARMV5TE_UNKNOWN_LINUX_MUSLEABI_LINKER=arm-linux-musleabi-gcc \
31+
ENV CROSS_TARGET_LINKER=arm-linux-musleabi-gcc \
32+
CARGO_TARGET_ARMV5TE_UNKNOWN_LINUX_MUSLEABI_LINKER=musl-linker.sh \
3033
CARGO_TARGET_ARMV5TE_UNKNOWN_LINUX_MUSLEABI_RUNNER="/qemu-runner arm" \
3134
CC_armv5te_unknown_linux_musleabi=arm-linux-musleabi-gcc \
3235
CXX_armv5te_unknown_linux_musleabi=arm-linux-musleabi-g++ \

docker/Dockerfile.armv7-unknown-linux-musleabi

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,12 @@ ENV CROSS_MUSL_SYSROOT=/usr/local/arm-linux-musleabi
2525
COPY musl-symlink.sh /
2626
RUN /musl-symlink.sh $CROSS_MUSL_SYSROOT arm
2727

28+
COPY musl-linker.sh /usr/bin/
29+
2830
COPY qemu-runner /
2931

30-
ENV CARGO_TARGET_ARMV7_UNKNOWN_LINUX_MUSLEABI_LINKER=arm-linux-musleabi-gcc \
32+
ENV CROSS_TARGET_LINKER=arm-linux-musleabi-gcc \
33+
CARGO_TARGET_ARMV7_UNKNOWN_LINUX_MUSLEABI_LINKER=musl-linker.sh \
3134
CARGO_TARGET_ARMV7_UNKNOWN_LINUX_MUSLEABI_RUNNER="/qemu-runner armv7" \
3235
CC_armv7_unknown_linux_musleabi=arm-linux-musleabi-gcc \
3336
CXX_armv7_unknown_linux_musleabi=arm-linux-musleabi-g++ \

docker/Dockerfile.armv7-unknown-linux-musleabihf

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,12 @@ ENV CROSS_MUSL_SYSROOT=/usr/local/arm-linux-musleabihf
2525
COPY musl-symlink.sh /
2626
RUN /musl-symlink.sh $CROSS_MUSL_SYSROOT armhf
2727

28+
COPY musl-linker.sh /usr/bin/
29+
2830
COPY qemu-runner /
2931

30-
ENV CARGO_TARGET_ARMV7_UNKNOWN_LINUX_MUSLEABIHF_LINKER=arm-linux-musleabihf-gcc \
32+
ENV CROSS_TARGET_LINKER=arm-linux-musleabihf-gcc \
33+
CARGO_TARGET_ARMV7_UNKNOWN_LINUX_MUSLEABIHF_LINKER=musl-linker.sh \
3134
CARGO_TARGET_ARMV7_UNKNOWN_LINUX_MUSLEABIHF_RUNNER="/qemu-runner armv7" \
3235
CC_armv7_unknown_linux_musleabihf=arm-linux-musleabihf-gcc \
3336
CXX_armv7_unknown_linux_musleabihf=arm-linux-musleabihf-g++ \

docker/Dockerfile.i586-unknown-linux-musl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,12 @@ ENV CROSS_MUSL_SYSROOT=/usr/local/i586-linux-musl
2020
COPY musl-symlink.sh /
2121
RUN /musl-symlink.sh $CROSS_MUSL_SYSROOT i386
2222

23+
COPY musl-linker.sh /usr/bin/
24+
2325
COPY qemu-runner /
2426

25-
ENV CARGO_TARGET_I586_UNKNOWN_LINUX_MUSL_LINKER=i586-linux-musl-gcc \
27+
ENV CROSS_TARGET_LINKER=i586-linux-musl-gcc \
28+
CARGO_TARGET_I586_UNKNOWN_LINUX_MUSL_LINKER=musl-linker.sh \
2629
CARGO_TARGET_I586_UNKNOWN_LINUX_MUSL_RUNNER="/qemu-runner i586" \
2730
CC_i586_unknown_linux_musl=i586-linux-musl-gcc \
2831
CXX_i586_unknown_linux_musl=i586-linux-musl-g++ \

docker/Dockerfile.i686-unknown-linux-musl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,12 @@ ENV CROSS_MUSL_SYSROOT=/usr/local/i686-linux-musl
2020
COPY musl-symlink.sh /
2121
RUN /musl-symlink.sh $CROSS_MUSL_SYSROOT i386
2222

23+
COPY musl-linker.sh /usr/bin/
24+
2325
COPY qemu-runner /
2426

25-
ENV CARGO_TARGET_I686_UNKNOWN_LINUX_MUSL_LINKER=i686-linux-musl-gcc \
27+
ENV CROSS_TARGET_LINKER=i686-linux-musl-gcc \
28+
CARGO_TARGET_I686_UNKNOWN_LINUX_MUSL_LINKER=musl-linker.sh \
2629
CARGO_TARGET_I686_UNKNOWN_LINUX_MUSL_RUNNER="/qemu-runner i686" \
2730
CC_i686_unknown_linux_musl=i686-linux-musl-gcc \
2831
CXX_i686_unknown_linux_musl=i686-linux-musl-g++ \

docker/Dockerfile.mips-unknown-linux-musl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,12 @@ ENV CROSS_MUSL_SYSROOT=/usr/local/mips-linux-muslsf
2222
COPY musl-symlink.sh /
2323
RUN /musl-symlink.sh $CROSS_MUSL_SYSROOT mips-sf
2424

25+
COPY musl-linker.sh /usr/bin/
26+
2527
COPY qemu-runner /
2628

27-
ENV CARGO_TARGET_MIPS_UNKNOWN_LINUX_MUSL_LINKER=mips-linux-muslsf-gcc \
29+
ENV CROSS_TARGET_LINKER=mips-linux-muslsf-gcc \
30+
CARGO_TARGET_MIPS_UNKNOWN_LINUX_MUSL_LINKER=musl-linker.sh \
2831
CARGO_TARGET_MIPS_UNKNOWN_LINUX_MUSL_RUNNER="/qemu-runner mips" \
2932
CC_mips_unknown_linux_musl=mips-linux-muslsf-gcc \
3033
CXX_mips_unknown_linux_musl=mips-linux-muslsf-g++ \

docker/Dockerfile.mips64-unknown-linux-muslabi64

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,12 @@ RUN mkdir -p $CROSS_MUSL_SYSROOT/usr/lib64
2525
RUN ln -s $CROSS_MUSL_SYSROOT/usr/lib/libc.so $CROSS_MUSL_SYSROOT/usr/lib64/libc.so
2626
RUN ln -s $CROSS_MUSL_SYSROOT/usr/lib/libc.so.1 $CROSS_MUSL_SYSROOT/usr/lib64/libc.so.1
2727

28-
COPY mips64-linux-muslabi64-gcc.sh /usr/bin/
28+
COPY musl-linker.sh /usr/bin/
2929

3030
COPY qemu-runner /
3131

32-
ENV CARGO_TARGET_MIPS64_UNKNOWN_LINUX_MUSLABI64_LINKER=mips64-linux-muslabi64-gcc.sh \
32+
ENV CROSS_TARGET_LINKER=mips64-linux-muslabi64-gcc \
33+
CARGO_TARGET_MIPS64_UNKNOWN_LINUX_MUSLABI64_LINKER=musl-linker.sh \
3334
CARGO_TARGET_MIPS64_UNKNOWN_LINUX_MUSLABI64_RUNNER="/qemu-runner mips64" \
3435
CC_mips64_unknown_linux_muslabi64=mips64-linux-musl-gcc \
3536
CXX_mips64_unknown_linux_muslabi64=mips64-linux-musl-g++ \

docker/Dockerfile.mips64el-unknown-linux-muslabi64

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ RUN /musl-symlink.sh $CROSS_MUSL_SYSROOT mips64el-sf
2323

2424
COPY qemu-runner /
2525

26-
ENV CARGO_TARGET_MIPS64EL_UNKNOWN_LINUX_MUSLABI64_LINKER=mips64el-linux-muslsf-gcc \
26+
ENV CROSS_TARGET_LINKER=mips64el-linux-muslsf-gcc \
27+
CARGO_TARGET_MIPS64EL_UNKNOWN_LINUX_MUSLABI64_LINKER=musl-linker.sh \
2728
CARGO_TARGET_MIPS64EL_UNKNOWN_LINUX_MUSLABI64_RUNNER="/qemu-runner mips64el" \
2829
CC_mips64el_unknown_linux_muslabi64=mips64el-linux-muslsf-gcc \
2930
CXX_mips64el_unknown_linux_muslabi64=mips64el-linux-muslsf-g++ \

docker/Dockerfile.mipsel-unknown-linux-musl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,12 @@ ENV CROSS_MUSL_SYSROOT=/usr/local/mipsel-linux-muslsf
2222
COPY musl-symlink.sh /
2323
RUN /musl-symlink.sh $CROSS_MUSL_SYSROOT mipsel-sf
2424

25+
COPY musl-linker.sh /usr/bin/
26+
2527
COPY qemu-runner /
2628

27-
ENV CARGO_TARGET_MIPSEL_UNKNOWN_LINUX_MUSL_LINKER=mipsel-linux-muslsf-gcc \
29+
ENV CROSS_TARGET_LINKER=mipsel-linux-muslsf-gcc \
30+
CARGO_TARGET_MIPSEL_UNKNOWN_LINUX_MUSL_LINKER=musl-linker.sh \
2831
CARGO_TARGET_MIPSEL_UNKNOWN_LINUX_MUSL_RUNNER="/qemu-runner mipsel" \
2932
CC_mipsel_unknown_linux_musl=mipsel-linux-muslsf-gcc \
3033
CXX_mipsel_unknown_linux_musl=mipsel-linux-muslsf-g++ \

docker/Dockerfile.x86_64-unknown-linux-musl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,12 @@ ENV CROSS_MUSL_SYSROOT=/usr/local/x86_64-linux-musl
2020
COPY musl-symlink.sh /
2121
RUN /musl-symlink.sh $CROSS_MUSL_SYSROOT x86_64
2222

23+
COPY musl-linker.sh /usr/bin/
24+
2325
COPY qemu-runner /
2426

25-
ENV CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_LINKER=x86_64-linux-musl-gcc \
27+
ENV CROSS_TARGET_LINKER=x86_64-linux-musl-gcc \
28+
CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_LINKER=musl-linker.sh \
2629
CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_RUNNER="/qemu-runner x86_64" \
2730
CC_x86_64_unknown_linux_musl=x86_64-linux-musl-gcc \
2831
CXX_x86_64_unknown_linux_musl=x86_64-linux-musl-g++ \

docker/aarch64-linux-musl-gcc.sh

Lines changed: 0 additions & 26 deletions
This file was deleted.

docker/mips64-linux-muslabi64-gcc.sh

Lines changed: 0 additions & 18 deletions
This file was deleted.

docker/musl-linker.sh

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#!/bin/bash
2+
3+
# this fixes a series of issues affecting musl targets, with missing
4+
# instrinsics that are symbols present in libgcc but not in the compiler
5+
# builtins. this is therefore a temporary workaround until these
6+
# issues are fixed. example issues previously discovered are noted below:
7+
8+
# mips64-unknown-linux-musl
9+
# this linker wrapper works around issue https://github.com/rust-lang/rust/issues/46651
10+
# which affects toolchains older than 1.48
11+
# older toolchains require the `-lgcc` linker flag otherwise they fail to link
12+
13+
# mips64-unknown-linux-gnuabi64
14+
# this fixes an issue of missing symbols from the command lines
15+
# these soft-float routines are required even for hard-float targets.
16+
# (strtod.lo): undefined reference to symbol '__trunctfsf2@@GCC_3.0'
17+
18+
set -x
19+
set -euo pipefail
20+
21+
main() {
22+
if [[ $# -gt 0 ]]; then
23+
exec "${CROSS_TARGET_LINKER}" "${@}" -lgcc -static-libgcc
24+
else
25+
exec "${CROSS_TARGET_LINKER}" "${@}"
26+
fi
27+
}
28+
29+
main "${@}"

0 commit comments

Comments
 (0)