cross-toolchain/altcross.sh
Alexey Sheplyakov dfe065bd30 altcross.sh: disable libsanitizer to avoid build error
libsanitizer wants limits.h, which is a part of compiler. However
the compiler hasn't been installed yet, since we are building its
runtime. Disable libsanitizer to avoid the problem.

TODO: Perhaps there's a special target to build an install compiler
headers only. Figure it out and re-enable libsanitizer.
2021-07-29 21:11:56 +04:00

151 lines
4.5 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
set -e
set -x
KERNEL_VERSION='5.10'
BINUTILS_VERSION='2.35.2'
GCC_VERSION='10.3.1-20210703'
GLIBC_VERSION='2.32-alt4'
KERNEL_SOURCE="`find /usr/src/kernel/sources -type f -name 'kernel-source-*.tar'`"
BINUTILS_SOURCE="`find /usr/src/binutils-source -type f -name 'binutils-*.tar'`"
GCC_SOURCE="`find /usr/src/gcc-source -type f -name 'gcc-*.tar'`"
GLIBC_SOURCE="`find /usr/src/glibc-source -type f -name 'glibc-*.tar'`"
TARGET=aarch64-linux-gnu
GCC_MAJOR_VERSION="${GCC_VERSION%%.*}"
BUILDDIR="`pwd`/build"
SRCDIR="`pwd`/src"
INSTALLDIR="`pwd`/inst/altcross-gcc-${GCC_VERSION}"
SYSROOT=/$TARGET/libc
SYSROOTDIR="$INSTALLDIR/$SYSROOT"
mkdir -p -m755 "$SRCDIR"
cd "$SRCDIR"
mkdir -p -m755 linux binutils gcc glibc
tar -x --strip-components=1 -f "$KERNEL_SOURCE" -C linux
tar -x --strip-components=1 -f "$BINUTILS_SOURCE" -C binutils
tar -x --strip-components=1 -f "$GCC_SOURCE" -C gcc
tar -x --strip-components=1 -f "$GLIBC_SOURCE" -C glibc
cd "gcc"
sed -i contrib/download_prerequisites -e '/base_url=/s/ftp/http/'
./contrib/download_prerequisites
mkdir -p -m755 "$INSTALLDIR/bin"
export PATH="$INSTALLDIR/bin:/usr/lib/ccache:$PATH"
unset LD_LIBRARY_PATH
mkdir -p -m755 \
"$BUILDDIR/obj_binutils" \
"$BUILDDIR/obj_gcc" \
"$BUILDDIR/obj_glibc" \
"$BUILDDIR/obj_linux" \
make -j$(nproc) \
-C "$SRCDIR/linux" \
O="$BUILDDIR/obj_linux" \
ARCH=arm64 \
INSTALL_HDR_PATH="$SYSROOTDIR/usr" \
headers_install
# binutils
cd "$BUILDDIR/obj_binutils"
../../src/binutils/configure \
--target="$TARGET" \
--prefix= \
--with-sysroot="$SYSROOT" \
--with-build-sysroot="$SYSROOTDIR" \
--disable-multilib
make -j$(nproc)
make -j$(nproc) install DESTDIR="$INSTALLDIR"
# gcc
# Disable libsanitizer to avoid the build failure:
#
# ../../../../../src/gcc/libsanitizer/asan/asan_linux.cpp: In function void __asan::AsanCheckIncompatibleRT():
# ../../../../../src/gcc/libsanitizer/asan/asan_linux.cpp:217:21: error: PATH_MAX was not declared in this scope
# 217 | char filename[PATH_MAX];
# | ^~~~~~~~
# ../../../../../src/gcc/libsanitizer/asan/asan_linux.cpp:218:35: error: filename was not declared in this scope; did you mean fileno?
# 218 | MemoryMappedSegment segment(filename, sizeof(filename));
# | ^~~~~~~~
# | fileno
cd "$BUILDDIR/obj_gcc"
../../src/gcc/configure \
--prefix= \
--target=$TARGET \
--enable-languages=c,c++ \
--enable-version-specific-runtime-libs \
--with-sysroot="$SYSROOT" \
--with-build-sysroot="$SYSROOTDIR" \
--with-gcc-major-version-only \
--disable-libsanitizer \
--disable-multilib
# compiler only
make -j$(nproc) all-gcc
make -j$(nproc) install-gcc DESTDIR="$INSTALLDIR"
# glibc
cd "$BUILDDIR/obj_glibc"
../../src/glibc/configure \
--prefix=/usr \
--target=$TARGET \
--host=$TARGET \
--build="$MACHTYPE" \
--with-sysroot="$SYSROOT" \
--with-build-sysroot="$SYSROOTDIR" \
--with-headers="$SYSROOTDIR"/usr/include \
--with-lib="$SYSROOTDIR"/usr/lib \
--disable-multilib \
--disable-crypt \
libc_cv_forced_unwind=yes
# glibc: headers + C runtime bits
make -j$(nproc) install-bootstrap-headers=yes install-headers DESTDIR="$SYSROOTDIR"
make -j$(nproc) csu/subdir_lib
install -d -m755 "$SYSROOTDIR"/usr/lib
install csu/crt1.o csu/crti.o csu/crtn.o "$SYSROOTDIR"/usr/lib
$TARGET-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o "$SYSROOTDIR"/usr/lib/libc.so
touch "$SYSROOTDIR"/usr/include/gnu/stubs.h "$SYSROOTDIR"/usr/include/bits/stdio_lim.h
# GCC: runtime (libgcc)
cd "$BUILDDIR/obj_gcc"
make -j$(nproc) all-target-libgcc
make -j$(nproc) install-target-libgcc DESTDIR="$INSTALLDIR"
# finish off glibc
cd "$BUILDDIR/obj_glibc"
make -j$(nproc)
make install DESTDIR="$SYSROOTDIR"
# finish off GCC
cd "$BUILDDIR/obj_gcc"
make -j$(nproc)
make -j$(nproc) install DESTDIR="$INSTALLDIR"
# set /lib64/ld-linux-aarch64.so.1 as ELF interpreter
$INSTALLDIR/bin/${TARGET}-gcc -dumpspecs > $BUILDDIR/specs
sed -e 's;/lib/ld-linux-aarch64;/lib64/ld-linux-aarch64;g' -i $BUILDDIR/specs
# Use aarch64-linux-gnu-as instead of generic `as`
sed -e "/^[*]invoke_as:/,/^[*]cpp:/ s; as ; ../../../../bin/${TARGET}-as ;" -i $BUILDDIR/specs
# Same for objcopy
sed -e "s; objcopy ; ../../../../bin/${TARGET}-objcopy /" -i $BUILDDIR/specs
mv $BUILDDIR/specs "$INSTALLDIR/lib/gcc/$TARGET/${GCC_MAJOR_VERSION}/"
# relocate libgcc_s
mv $INSTALLDIR/lib/gcc/$TARGET/lib64/libgcc_s.so* "$INSTALLDIR/lib/gcc/$TARGET/${GCC_MAJOR_VERSION}/"
rmdir "$INSTALLDIR/lib/gcc/$TARGET/lib64"