Details on this package are located in Section 8.28.2, “Contents of GCC.”
The GCC package contains the GNU compiler collection, which includes the C and C++ compilers.
Again, fix an issue producing illegal instructions in linked executables and shared libraries with GCC 13.2.0 and Binutils-2.42:
sed -e '/ASM_OUTPUT_ALIGN_WITH_NOP/,+1d' \ -i gcc/config/loongarch/loongarch.h
As in the first build of GCC, the GMP, MPFR, and MPC packages are required. Unpack the tarballs and move them into the required directories:
tar -xf ../mpfr-4.2.1.tar.xz mv -v mpfr-4.2.1 mpfr tar -xf ../gmp-6.3.0.tar.xz mv -v gmp-6.3.0 gmp tar -xf ../mpc-1.3.1.tar.gz mv -v mpc-1.3.1 mpc
Set the default directory name for 64-bit libraries to “lib”:
sed -e 's/lib64/lib/' \ -i.orig gcc/config/loongarch/{t-linux,linux.h}
Override the building rule of libgcc and libstdc++ headers, to allow building these libraries with POSIX threads support:
sed '/thread_header =/s/@.*@/gthr-posix.h/' \ -i libgcc/Makefile.in libstdc++-v3/include/Makefile.in
Create a separate build directory again:
mkdir -v build cd build
Before starting to build GCC, remember to unset any environment variables that override the default optimization flags.
Now prepare GCC for compilation:
../configure \ --build=$(../config.guess) \ --host=$LFS_TGT \ --target=$LFS_TGT \ LDFLAGS_FOR_TARGET=-L$PWD/$LFS_TGT/libgcc \ --prefix=/usr \ --with-build-sysroot=$LFS \ --enable-default-pie \ --enable-default-ssp \ --disable-nls \ --disable-multilib \ --disable-libatomic \ --disable-libgomp \ --disable-libquadmath \ --disable-libsanitizer \ --disable-libssp \ --disable-libvtv \ --enable-languages=c,c++
The meaning of the new configure options:
--with-build-sysroot=$LFS
Normally, using --host
ensures that a
cross-compiler is used for building GCC, and that compiler
knows that it has to look for headers and libraries in
$LFS
. But the build system for
GCC uses other tools, which are not aware of this location.
This switch is needed so those tools will find the needed
files in $LFS
, and not on the
host.
--target=$LFS_TGT
We are cross-compiling GCC, so it's impossible to build
target libraries (libgcc
and
libstdc++
) with the previously
compiled GCC binaries—those binaries won't run on the host.
The GCC build system will attempt to use the host's C and C++
compilers as a workaround by default. Building the GCC target
libraries with a different version of GCC is not supported,
so using the host's compilers may cause the build to fail.
This parameter ensures the libraries are built by GCC pass 1.
LDFLAGS_FOR_TARGET=...
Allow libstdc++
to use the
shared libgcc
being built in
this pass, instead of the static version that was built in
GCC pass 1. This is necessary to support C++ exception
handling.
--disable-libsanitizer
Disable GCC sanitizer runtime libraries. They are not needed
for the temporary installation. This switch is necessary to
build GCC without libcrypt
installed for the target. In gcc-pass1 it was implied
by --disable-libstdcxx
, but now we
have to explicitly pass it.
Compile the package:
make
Install the package:
make DESTDIR=$LFS install
As a finishing touch, create a utility symlink. Many programs and scripts run cc instead of gcc, which is used to keep programs generic and therefore usable on all kinds of UNIX systems where the GNU C compiler is not always installed. Running cc leaves the system administrator free to decide which C compiler to install:
ln -sv gcc $LFS/usr/bin/cc
Details on this package are located in Section 8.28.2, “Contents of GCC.”