Skip to content

Commit a0b1f7d

Browse files
committed
linux-musl: Fix riscv64 build, reduce hard-coded GCC versions
1 parent 270d4ff commit a0b1f7d

11 files changed

+59
-43
lines changed

.github/.cspell/project-dictionary.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ SYSV
128128
TOOLDIR
129129
uclibcgnueabi
130130
uclibcgnueabihf
131+
udivsi
131132
unikraft
132133
untngdnb
133134
versatilepb
@@ -141,5 +142,6 @@ winehq
141142
WINEPATH
142143
WINEPREFIX
143144
wineserver
145+
zmmul
144146
Znwm
145147
zynq

docker/base/linux-musl.Dockerfile

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@
88

99
# TODO: enable debuginfo https://github.com/rust-lang/rust/pull/90733
1010

11-
# Use the fork that contains a patch to fix CVE-2020-28928 for musl 1.1 and add binutils 2.36.1 hash for riscv.
11+
# Use the fork that contains a patch to fix CVE-2020-28928 for musl 1.1 and add some hashes for riscv.
1212
# https://github.com/taiki-e/musl-cross-make/tree/dev
13-
ARG MUSL_CROSS_MAKE_REV=445fb6748c1d4b416b54d0a19d9d14204c8f298d
13+
ARG MUSL_CROSS_MAKE_REV=060a2763225cbc325cffce7e7e08e62a7df1ad3b
1414
# Available versions: https://github.com/richfelker/musl-cross-make/tree/HEAD/hashes
1515
# Default: https://github.com/richfelker/musl-cross-make/blob/HEAD/Makefile
1616
ARG BINUTILS_VERSION=2.33.1
1717
ARG GCC_VERSION=9.4.0
1818
ARG MUSL_VERSION
19-
ARG LINUX_VERSION=headers-4.19.88-1
19+
ARG LINUX_VERSION=headers-4.19.88-2
2020

2121
FROM ghcr.io/taiki-e/build-base:alpine AS builder
2222
SHELL ["/bin/bash", "-eEuxo", "pipefail", "-c"]
@@ -55,18 +55,23 @@ ARG LINUX_VERSION
5555
# https://github.com/richfelker/musl-cross-make/blob/0f22991b8d47837ef8dd60a0c43cf40fcf76217a/config.mak.dist
5656
# https://conf.musl.cc/plain_20210301_10-2-1.txt
5757
# See also cc-rs for target flags: https://github.com/rust-lang/cc-rs/blob/1.0.73/src/lib.rs#L1649
58-
# Use binutils 2.36.1 for riscv because linker error "unsupported ISA subset 'z'" since nightly-2023-08-09 (LLVM 17)
58+
# Use binutils 2.40 for riscv because linker error "unknown z ISA extension `zmmul'" with LLVM 19
59+
# Use gcc 13.2 for riscv because linker error "relocation R_RISCV_JAL against `__udivsi3' which may bind externally can not be used when making a shared object; recompile with -fPIC"
5960
# Use musl 1.2.5 for riscv32/loongarch64 because support for them has been added in 1.2.5: https://github.com/bminor/musl/commit/01d9fe4d9f7cce7a6dbaece0e2e405a2e3279244 / https://github.com/bminor/musl/commit/522bd54edaa2fa404fd428f8ad0bcb0f0bec5639
6061
RUN <<EOF
6162
cc_target=$(</CC_TARGET)
6263
case "${RUST_TARGET}" in
63-
riscv*) BINUTILS_VERSION=2.36.1 ;;
64+
riscv*)
65+
BINUTILS_VERSION=2.40
66+
GCC_VERSION=13.2.0
67+
;;
6468
esac
6569
if [[ "${MUSL_VERSION}" == "1.2.3" ]]; then
6670
case "${RUST_TARGET}" in
67-
riscv32* | loongarch64*) MUSL_VERSION=1.2.5 ;;
71+
riscv32* | loongarch64-*) MUSL_VERSION=1.2.5 ;;
6872
esac
6973
fi
74+
export CFLAGS="-fPIC -g1 ${CFLAGS:-}"
7075
cd musl-cross-make
7176
cat >./config.mak <<EOF2
7277
OUTPUT = ${TOOLCHAIN_DIR}

docker/dragonfly.Dockerfile

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,12 @@ ARG SYSROOT_DIR="${TOOLCHAIN_DIR}/${RUST_TARGET}"
2626
RUN mkdir -p "${SYSROOT_DIR}"
2727
COPY --from=sysroot /sysroot/. "${SYSROOT_DIR}"
2828

29-
ARG GCC_VERSION=8.0
30-
RUN --mount=type=bind,target=/docker \
31-
COMMON_FLAGS="-fuse-ld=lld -B\"\${toolchain_dir}\"/${RUST_TARGET}/usr/lib/gcc${GCC_VERSION/./} -B\"\${toolchain_dir}\"/${RUST_TARGET}/usr/lib -L\"\${toolchain_dir}\"/${RUST_TARGET}/lib -L\"\${toolchain_dir}\"/${RUST_TARGET}/usr/lib -L\"\${toolchain_dir}\"/${RUST_TARGET}/usr/lib/gcc${GCC_VERSION/./}" \
32-
CXXFLAGS="-I\"\${toolchain_dir}\"/${RUST_TARGET}/usr/include/c++/${GCC_VERSION} -I\"\${toolchain_dir}\"/${RUST_TARGET}/usr/include/g++" \
29+
RUN --mount=type=bind,target=/docker <<EOF
30+
gcc_version=8.0
31+
COMMON_FLAGS="-fuse-ld=lld -B\"\${toolchain_dir}\"/${RUST_TARGET}/usr/lib/gcc${gcc_version/./} -B\"\${toolchain_dir}\"/${RUST_TARGET}/usr/lib -L\"\${toolchain_dir}\"/${RUST_TARGET}/lib -L\"\${toolchain_dir}\"/${RUST_TARGET}/usr/lib -L\"\${toolchain_dir}\"/${RUST_TARGET}/usr/lib/gcc${gcc_version/./}" \
32+
CXXFLAGS="-I\"\${toolchain_dir}\"/${RUST_TARGET}/usr/include/c++/${gcc_version} -I\"\${toolchain_dir}\"/${RUST_TARGET}/usr/include/g++" \
3333
/docker/clang-cross.sh
34+
EOF
3435

3536
FROM ghcr.io/taiki-e/build-base:ubuntu-"${UBUNTU_VERSION}" AS test-base
3637
SHELL ["/bin/bash", "-eEuxo", "pipefail", "-c"]

docker/illumos.Dockerfile

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,12 @@ ARG TOOLCHAIN_DIR="/${RUST_TARGET}"
1616
ARG SYSROOT_DIR="${TOOLCHAIN_DIR}/${RUST_TARGET}"
1717
COPY --from=toolchain "${TOOLCHAIN_DIR}" "${TOOLCHAIN_DIR}"
1818

19-
ARG GCC_VERSION=8.5.0
20-
RUN --mount=type=bind,target=/docker \
21-
COMMON_FLAGS="--gcc-toolchain=\"\${toolchain_dir}\"" \
22-
CXXFLAGS="-I\"\${toolchain_dir}\"/${RUST_TARGET}/include/c++/${GCC_VERSION} -I\"\${toolchain_dir}\"/${RUST_TARGET}/include/c++/${GCC_VERSION}/${RUST_TARGET}" \
19+
RUN --mount=type=bind,target=/docker <<EOF
20+
gcc_version=$("${TOOLCHAIN_DIR}/bin/${RUST_TARGET}-gcc" --version | sed -n '1 s/^.*) //p')
21+
COMMON_FLAGS="--gcc-toolchain=\"\${toolchain_dir}\"" \
22+
CXXFLAGS="-I\"\${toolchain_dir}\"/${RUST_TARGET}/include/c++/${gcc_version} -I\"\${toolchain_dir}\"/${RUST_TARGET}/include/c++/${gcc_version}/${RUST_TARGET}" \
2323
/docker/clang-cross.sh
24+
EOF
2425

2526
FROM ghcr.io/taiki-e/build-base:ubuntu-"${UBUNTU_VERSION}" AS test-base
2627
SHELL ["/bin/bash", "-eEuxo", "pipefail", "-c"]

docker/linux-gnu.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ apt_target="${apt_target:-"${cc_target/i586/i686}"}"
148148
echo "${cc_target}" >/CC_TARGET
149149
echo "${apt_target}" >/APT_TARGET
150150

151-
gcc_version="${GCC_VERSION:-"$(gcc --version | sed -n '1 s/^.*) //p')"}"
151+
gcc_version=$(gcc --version | sed -n '1 s/^.*) //p')
152152
echo "${gcc_version}" >/GCC_VERSION
153153
mkdir -p /tmp/toolchain
154154
cd /tmp/toolchain

docker/linux-musl.Dockerfile

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ ARG HOST_ARCH=amd64
1313

1414
# See tools/build-docker.sh
1515
ARG MUSL_VERSION
16-
ARG GCC_VERSION=9.4.0
1716

1817
FROM ghcr.io/taiki-e/rust-cross-toolchain:"${RUST_TARGET}${MUSL_VERSION}-base${TOOLCHAIN_TAG:+"-${TOOLCHAIN_TAG}"}-${HOST_ARCH}" AS toolchain
1918

@@ -53,22 +52,27 @@ esac
5352
echo "${cc_target}" >/CC_TARGET
5453
EOF
5554

56-
ARG GCC_VERSION
5755
RUN --mount=type=bind,target=/docker <<EOF
56+
case "${RUST_TARGET}" in
57+
hexagon-*)
58+
rm -f "${TOOLCHAIN_DIR}"/bin/qemu-* # TODO: rm
59+
exit 0
60+
;;
61+
esac
62+
gcc_version=$("${TOOLCHAIN_DIR}/bin/${RUST_TARGET}-gcc" --version | sed -n '1 s/^.*) //p')
5863
export COMMON_FLAGS="--gcc-toolchain=\"\${toolchain_dir}\""
5964
case "${RUST_TARGET}" in
60-
hexagon-*) rm -f "${TOOLCHAIN_DIR}"/bin/qemu-* ;; # TODO: rm
6165
riscv64*)
62-
COMMON_FLAGS="${COMMON_FLAGS} --ld-path=\"\${toolchain_dir}\"/bin/${RUST_TARGET}-ld -B\"\${toolchain_dir}\"/lib/gcc/${RUST_TARGET}/${GCC_VERSION} -L\"\${toolchain_dir}\"/lib/gcc/${RUST_TARGET}/${GCC_VERSION}" \
63-
CXXFLAGS="-I\"\${toolchain_dir}\"/${RUST_TARGET}/include/c++/${GCC_VERSION} -I\"\${toolchain_dir}\"/${RUST_TARGET}/include/c++/${GCC_VERSION}/${RUST_TARGET}" \
66+
COMMON_FLAGS="${COMMON_FLAGS} --ld-path=\"\${toolchain_dir}\"/bin/${RUST_TARGET}-ld -B\"\${toolchain_dir}\"/lib/gcc/${RUST_TARGET}/${gcc_version} -L\"\${toolchain_dir}\"/lib/gcc/${RUST_TARGET}/${gcc_version}" \
67+
CXXFLAGS="-I\"\${toolchain_dir}\"/${RUST_TARGET}/include/c++/${gcc_version} -I\"\${toolchain_dir}\"/${RUST_TARGET}/include/c++/${gcc_version}/${RUST_TARGET}" \
6468
/docker/clang-cross.sh
6569
;;
6670
aarch64-* | mips64-* | mips64el-* | powerpc64-* | powerpc64le-* | s390x-* | x86_64*)
6771
/docker/clang-cross.sh
6872
;;
6973
*)
70-
COMMON_FLAGS="${COMMON_FLAGS} -B\"\${toolchain_dir}\"/lib/gcc/${RUST_TARGET}/${GCC_VERSION} -L\"\${toolchain_dir}\"/lib/gcc/${RUST_TARGET}/${GCC_VERSION}" \
71-
CXXFLAGS="-I\"\${toolchain_dir}\"/${RUST_TARGET}/include/c++/${GCC_VERSION} -I\"\${toolchain_dir}\"/${RUST_TARGET}/include/c++/${GCC_VERSION}/${RUST_TARGET}" \
74+
COMMON_FLAGS="${COMMON_FLAGS} -B\"\${toolchain_dir}\"/lib/gcc/${RUST_TARGET}/${gcc_version} -L\"\${toolchain_dir}\"/lib/gcc/${RUST_TARGET}/${gcc_version}" \
75+
CXXFLAGS="-I\"\${toolchain_dir}\"/${RUST_TARGET}/include/c++/${gcc_version} -I\"\${toolchain_dir}\"/${RUST_TARGET}/include/c++/${gcc_version}/${RUST_TARGET}" \
7276
/docker/clang-cross.sh
7377
;;
7478
esac
@@ -92,7 +96,6 @@ SHELL ["/bin/bash", "-eEuxo", "pipefail", "-c"]
9296
ARG DEBIAN_FRONTEND=noninteractive
9397
ARG RUST_TARGET
9498
COPY --from=builder /"${RUST_TARGET}"/. /usr/local/
95-
ARG GCC_VERSION
9699
RUN <<EOF
97100
case "${RUST_TARGET}" in
98101
hexagon-*) ;;
@@ -107,7 +110,6 @@ SHELL ["/bin/bash", "-eEuxo", "pipefail", "-c"]
107110
ARG DEBIAN_FRONTEND=noninteractive
108111
ARG RUST_TARGET
109112
COPY --from=builder /"${RUST_TARGET}" /"${RUST_TARGET}"
110-
ARG GCC_VERSION
111113
ENV PATH="/${RUST_TARGET}/bin:$PATH"
112114
RUN /test/check.sh
113115
RUN <<EOF

docker/linux-uclibc.Dockerfile

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ ARG UBUNTU_VERSION=20.04
1212
# https://toolchains.bootlin.com/toolchains.html
1313
# NB: When updating this, the reminder to update uClibc-ng/GCC version in README.md.
1414
ARG TOOLCHAIN_VERSION=2020.08-1
15-
ARG GCC_VERSION=10.2.0
1615

1716
FROM ghcr.io/taiki-e/downloader AS toolchain
1817
SHELL ["/bin/bash", "-eEuxo", "pipefail", "-c"]
@@ -70,12 +69,13 @@ EOF
7069
RUN --mount=type=bind,target=/docker \
7170
/docker/base/common.sh
7271

73-
ARG GCC_VERSION
74-
RUN --mount=type=bind,target=/docker \
75-
CC_TARGET="$(</CC_TARGET)" \
76-
COMMON_FLAGS="-B\"\${toolchain_dir}\"/lib/gcc/${RUST_TARGET}/${GCC_VERSION} -L\"\${toolchain_dir}\"/lib/gcc/${RUST_TARGET}/${GCC_VERSION}" \
77-
CXXFLAGS="-I\"\${toolchain_dir}\"/${RUST_TARGET}/include/c++/${GCC_VERSION} -I\"\${toolchain_dir}\"/${RUST_TARGET}/include/c++/${GCC_VERSION}/${RUST_TARGET}" \
72+
RUN --mount=type=bind,target=/docker <<EOF
73+
gcc_version=$("${TOOLCHAIN_DIR}/bin/${RUST_TARGET}-gcc" --version | sed -n '1 s/^.*) //p')
74+
CC_TARGET="$(</CC_TARGET)" \
75+
COMMON_FLAGS="-B\"\${toolchain_dir}\"/lib/gcc/${RUST_TARGET}/${gcc_version} -L\"\${toolchain_dir}\"/lib/gcc/${RUST_TARGET}/${gcc_version}" \
76+
CXXFLAGS="-I\"\${toolchain_dir}\"/${RUST_TARGET}/include/c++/${gcc_version} -I\"\${toolchain_dir}\"/${RUST_TARGET}/include/c++/${gcc_version}/${RUST_TARGET}" \
7877
/docker/clang-cross.sh
78+
EOF
7979

8080
FROM ghcr.io/taiki-e/build-base:ubuntu-"${UBUNTU_VERSION}" AS test-base
8181
SHELL ["/bin/bash", "-eEuxo", "pipefail", "-c"]

docker/redox.Dockerfile

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,12 @@ COPY --from=toolchain /toolchain "${TOOLCHAIN_DIR}"
2727
RUN --mount=type=bind,target=/docker \
2828
/docker/base/common.sh
2929

30-
ARG GCC_VERSION=13.2.0
31-
RUN --mount=type=bind,target=/docker \
32-
CFLAGS="-I\"\${toolchain_dir}\"/${RUST_TARGET}/include" \
33-
CXXFLAGS="-std=c++14 -isystem\"\${toolchain_dir}\"/${RUST_TARGET}/include -I\"\${toolchain_dir}\"/${RUST_TARGET}/include/c++/${GCC_VERSION} -I\"\${toolchain_dir}\"/${RUST_TARGET}/include/c++/${GCC_VERSION}/${RUST_TARGET}" \
30+
RUN --mount=type=bind,target=/docker <<EOF
31+
gcc_version=$("${TOOLCHAIN_DIR}/bin/${RUST_TARGET}-gcc" --version | sed -n '1 s/^.*) //p')
32+
CFLAGS="-I\"\${toolchain_dir}\"/${RUST_TARGET}/include" \
33+
CXXFLAGS="-std=c++14 -isystem\"\${toolchain_dir}\"/${RUST_TARGET}/include -I\"\${toolchain_dir}\"/${RUST_TARGET}/include/c++/${gcc_version} -I\"\${toolchain_dir}\"/${RUST_TARGET}/include/c++/${gcc_version}/${RUST_TARGET}" \
3434
/docker/clang-cross.sh
35+
EOF
3536

3637
FROM ghcr.io/taiki-e/build-base:ubuntu-"${UBUNTU_VERSION}" AS test-base
3738
SHELL ["/bin/bash", "-eEuxo", "pipefail", "-c"]

docker/solaris.Dockerfile

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,13 @@ ARG SYSROOT_DIR="${TOOLCHAIN_DIR}/${RUST_TARGET}"
1717
COPY --from=toolchain "${TOOLCHAIN_DIR}" "${TOOLCHAIN_DIR}"
1818

1919
# ARG SOLARIS_VERSION=2.11
20-
# ARG GCC_VERSION=8.5.0
2120
# TODO: unrecognized option '-C' from ld
22-
# RUN --mount=type=bind,target=/docker \
23-
# COMMON_FLAGS="--gcc-toolchain=\"\${toolchain_dir}\"" \
24-
# CXXFLAGS="-I\"\${toolchain_dir}\"/${RUST_TARGET}/include/c++/${GCC_VERSION} -I\"\${toolchain_dir}\"/${RUST_TARGET}/include/c++/${GCC_VERSION}/${RUST_TARGET}" \
21+
# RUN --mount=type=bind,target=/docker <<EOF
22+
# gcc_version=$("${TOOLCHAIN_DIR}/bin/${RUST_TARGET}-gcc" --version | sed -n '1 s/^.*) //p')
23+
# COMMON_FLAGS="--gcc-toolchain=\"\${toolchain_dir}\"" \
24+
# CXXFLAGS="-I\"\${toolchain_dir}\"/${RUST_TARGET}/include/c++/${gcc_version} -I\"\${toolchain_dir}\"/${RUST_TARGET}/include/c++/${gcc_version}/${RUST_TARGET}" \
2525
# /docker/clang-cross.sh
26+
# EOF
2627

2728
FROM ghcr.io/taiki-e/build-base:ubuntu-"${UBUNTU_VERSION}" AS test-base
2829
SHELL ["/bin/bash", "-eEuxo", "pipefail", "-c"]

docker/test/test.sh

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -353,9 +353,8 @@ if [[ -z "${no_std}" ]]; then
353353
if [[ -f /BUILD_STD ]]; then
354354
case "${RUST_TARGET}" in
355355
# TODO(powerpc-unknown-linux-musl)
356-
# TODO(riscv64gc-unknown-linux-musl)
357356
# TODO(powerpc64le,s390x,thumbv7neon,mips): libunwind build issue since around 2022-12-16: https://github.com/taiki-e/rust-cross-toolchain/commit/7913d98f9c73ffb83f46ab83019bdc3358503d8a
358-
powerpc-* | powerpc64le-* | riscv64* | s390x-* | thumbv7neon-* | mips*) ;;
357+
powerpc-* | powerpc64le-* | s390x-* | thumbv7neon-* | mips*) ;;
359358
*)
360359
rm -rf "${target_libdir}"
361360
mkdir -p "${self_contained}"
@@ -379,7 +378,11 @@ if [[ -z "${no_std}" ]]; then
379378
name = "build-std"
380379
edition = "2021"
381380
EOF
382-
RUSTFLAGS="${RUSTFLAGS:-} -C debuginfo=1 -L ${toolchain_dir}/${RUST_TARGET}/lib -L ${toolchain_dir}/lib/gcc/${RUST_TARGET}/${GCC_VERSION}" \
381+
case "${RUST_TARGET}" in
382+
hexagon-*) ;;
383+
*) gcc_version=$("${RUST_TARGET}-gcc" --version | sed -n '1 s/^.*) //p') ;;
384+
esac
385+
RUSTFLAGS="${RUSTFLAGS:-} -C debuginfo=1 -L ${toolchain_dir}/${RUST_TARGET}/lib -L ${toolchain_dir}/lib/gcc/${RUST_TARGET}/${gcc_version:-}" \
383386
x cargo build "${build_std[@]}" --target "${RUST_TARGET}" --all-targets --release
384387
rm target/"${RUST_TARGET}"/release/deps/*build_std-*
385388
cp target/"${RUST_TARGET}"/release/deps/lib*.rlib "${target_libdir}"
@@ -402,7 +405,7 @@ EOF
402405
;;
403406
*)
404407
cp -f "${toolchain_dir}/${RUST_TARGET}/lib"/{libc.a,Scrt1.o,crt1.o,crti.o,crtn.o,rcrt1.o} "${self_contained}"
405-
cp -f "${toolchain_dir}/lib/gcc/${RUST_TARGET}/${GCC_VERSION}"/{crtbegin.o,crtbeginS.o,crtend.o,crtendS.o} "${self_contained}"
408+
cp -f "${toolchain_dir}/lib/gcc/${RUST_TARGET}/${gcc_version}"/{crtbegin.o,crtbeginS.o,crtend.o,crtendS.o} "${self_contained}"
406409
;;
407410
esac
408411

0 commit comments

Comments
 (0)