Skip to content

Commit 21d663d

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. This is a temporary workaround until these are all implemented in compiler-builtins.
1 parent 678e3d7 commit 21d663d

17 files changed

+84
-59
lines changed

.changes/986.json

+5
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

+3-2
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

+4-1
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

+4-1
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

+4-1
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

+4-1
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

+4-1
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

+4-1
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

+4-1
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

+4-1
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

+3-2
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-musl-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

+4-1
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,12 @@ ENV CROSS_MUSL_SYSROOT=/usr/local/mips64el-linux-muslsf
2121
COPY musl-symlink.sh /
2222
RUN /musl-symlink.sh $CROSS_MUSL_SYSROOT mips64el-sf
2323

24+
COPY musl-linker.sh /usr/bin/
25+
2426
COPY qemu-runner /
2527

26-
ENV CARGO_TARGET_MIPS64EL_UNKNOWN_LINUX_MUSLABI64_LINKER=mips64el-linux-muslsf-gcc \
28+
ENV CROSS_TARGET_LINKER=mips64el-linux-muslsf-gcc \
29+
CARGO_TARGET_MIPS64EL_UNKNOWN_LINUX_MUSLABI64_LINKER=musl-linker.sh \
2730
CARGO_TARGET_MIPS64EL_UNKNOWN_LINUX_MUSLABI64_RUNNER="/qemu-runner mips64el" \
2831
CC_mips64el_unknown_linux_muslabi64=mips64el-linux-muslsf-gcc \
2932
CXX_mips64el_unknown_linux_muslabi64=mips64el-linux-muslsf-g++ \

docker/Dockerfile.mipsel-unknown-linux-musl

+4-1
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

+4-1
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

-26
This file was deleted.

docker/mips64-linux-muslabi64-gcc.sh

-18
This file was deleted.

docker/musl-linker.sh

+29
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)