Skip to content

Instantly share code, notes, and snippets.

@alfredfo
Last active July 5, 2023 08:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alfredfo/e6c65293eb210bcf58e7cbdc80db3d7c to your computer and use it in GitHub Desktop.
Save alfredfo/e6c65293eb210bcf58e7cbdc80db3d7c to your computer and use it in GitHub Desktop.
bootstrap llvm/musl cross compiler with compiler-rt
#!/bin/bash
set -xeuo pipefail
export ARCH=aarch64
export CTARGET="${ARCH}-gentoo-linux-musl"
export CROSS_COMPILE="llvm-"
export MUSL_TARBALL="/var/cache/distfiles/musl-1.2.4.tar.gz"
export LLVM_TARBALL="/var/cache/distfiles/llvm-project-16.0.6.src.tar.xz"
export COMPILER_RT_SRC="$(pwd)/sources/compiler-rt"
export MUSL_SRC="$(pwd)/sources/musl"
export MUSL_HEADERS="$(pwd)/sources/musl-headers"
mkdir -pv "${COMPILER_RT_SRC}" "${MUSL_SRC}" "${MUSL_HEADERS}"
tar xpvf "${MUSL_TARBALL}" -C "${MUSL_SRC}"
tar xpvf "${LLVM_TARBALL}" -C "${COMPILER_RT_SRC}"
pushd "${MUSL_SRC}/musl-1.2.4"
export CC=true
./configure \
--target=${CTARGET} \
--prefix="${MUSL_HEADERS}/usr" \
--syslibdir="${MUSL_HEADERS}/lib" \
--disable-gcc-wrapper
make install-headers
popd
export COMPILER_RT_BUILDDIR="${COMPILER_RT_SRC}/llvm-project-16.0.6.src/build-compiler-rt"
mkdir -pv "${COMPILER_RT_BUILDDIR}"
pushd "${COMPILER_RT_BUILDDIR}"
export CC="clang --no-default-config --target=${CTARGET} --rtlib=compiler-rt -fuse-ld=lld -fno-stack-protector"
cmake ../compiler-rt \
-G Ninja \
-DCOMPILER_RT_BUILD_BUILTINS=ON \
-DCOMPILER_RT_BUILD_SANITIZERS=OFF \
-DCOMPILER_RT_BUILD_XRAY=OFF \
-DCOMPILER_RT_BUILD_LIBFUZZER=OFF \
-DCOMPILER_RT_BUILD_PROFILE=OFF \
-DCMAKE_AR=$(llvm-config --bindir)/"${CROSS_COMPILE}"ar \
-DCMAKE_NM=$(llvm-config --bindir)/"${CROSS_COMPILE}"nm \
-DCMAKE_RANLIB=$(llvm-config --bindir)/"${CROSS_COMPILE}"ranlib \
-DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld" \
-DCMAKE_ASM_COMPILER_TARGET="${CTARGET}" \
-DCMAKE_C_COMPILER_TARGET="${CTARGET}" \
-DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON \
-DLLVM_CONFIG_PATH=llvm-config \
-DCMAKE_C_COMPILER_WORKS=1 \
-DCMAKE_CXX_COMPILER_WORKS=1 \
-DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=ON \
-DCMAKE_C_FLAGS="--target=${CTARGET} -isystem ${MUSL_HEADERS}/usr/include -nostdinc -v"
ninja -v
popd
pushd "${MUSL_SRC}/musl-1.2.4"
export LIBCC="${COMPILER_RT_BUILDDIR}"/lib/linux/libclang_rt.builtins-aarch64.a
./configure \
--target=${CTARGET} \
--disable-gcc-wrapper
make
popd
# test
mkdir -pv test/helloworld/
cat <<EOF > test/helloworld/main.c
#include <stdio.h>
#include <stdlib.h>
int main(void) {
puts("hello, world");
return EXIT_SUCCESS;
}
EOF
pushd test/helloworld
export MUSLLIB="${MUSL_SRC}/musl-1.2.4/lib"
clang --target="${CTARGET}" main.c -c -nostdinc -nostdlib -I"${MUSL_HEADERS}"/usr/include -v
ld.lld -static main.o \
"${COMPILER_RT_BUILDDIR}"/lib/${CTARGET}/libclang_rt.builtins.a \
"${MUSLLIB}"/crti.o "${MUSLLIB}"/crt1.o "${MUSLLIB}"/crtn.o "${MUSLLIB}"/libc.a
nm a.out | tail -n 20
readelf -h a.out
popd
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment