As mainly an LLVM person, I occasionally contribute to GNU toolchain projects. This is sometimes for fun, sometimes for investigating why an (usually ancient) feature works in a particular way, sometimes for pushing forward a toolchain feature with the mind of both communities, or sometimes just for getting sense of how things work with mailing list+GNU make.
For a debug build, I normally place my build directory
Debug directly under
the project root.
gas/, GNU assembler), ld (
ld/, GNU ld), gold (
gold/, GNU gold)
As of 2021-01, it has no wiki.
all builds targets
all-target. When running
configure, by default most top-level directories binutils
gas gdb gdbserver ld libctf are all enabled. You can disable some components via
--enable-gold is needed to enable gold.
mkdir Debug; cd Debug ../configure --target=x86_64-linux-gnu --prefix=/tmp/opt --disable-gdb --disable-gdbserver
For cross compiling, make sure your have
For many tools (binutils, gdb, ld),
--enable-targets=all will build every
supported architectures and binary formats. However, one gas build can only
support one architecture. ld has a default emulation and needs
-m to support
other architectures (
aarch64 architecture of input file 'a.o' is incompatible with i386:x86-64 output). Many tests are generic and can be run on many
targets, but a
--enable-targets=all build only tests its default target.
# binutils (binutils/*) make -C Debug all-binutils # gas (gas/as-new) make -C Debug all-gas # ld (ld/ld-new) make -C Debug all-ld # Build all enabled tools. make -C Debug all
Build with Clang:
mkdir -p out/clang-debug; cd out/clang-debug ../../configure CC=~/Stable/bin/clang CXX=~/Stable/bin/clang++ CFLAGS='-O0 -g' CXXFLAGS='-O0 -g'
About security aspect, “don’t run any of binutils as root” is sufficient advice (Alan Modra).
GNU Test Framework DejaGnu is based on Expect, which is in turn based on Tcl.
To run tests:
make -C Debug check-binutils # Find the result in (summary) Debug/binutils/binutils.sum and (details) Debug/binutils/binutils.log make -C Debug check-gas # Find the result in (summary) Debug/gas/testsuite/gas.sum and (details) Debug/gas/testsuite/gas.log make -C Debug check-ld # Test all enabled tools. make -C Debug check-all
For ld, tests are listed in
.exp files under
ld/testsuite. A single test
normally consists of a
.d file and several associated
To run the tests in
make -C Debug check-ld RUNTESTFLAGS=ld-shared/shared.exp
gdb resides in the binutils-gdb repository.
configure enables gdb and
gdbserver by default. You just need to make sure
--disable-gdb --disable-gdbserver is not on the configure line.
Run gdb under the build directory:
gdb/gdb -data-directory gdb/data-directory
To run the tests in
make check-gdb RUNTESTFLAGS=gdb.dwarf2/dw2-abs-hi-pc.exp # cd $build/gdb/testsuite/outputs/gdb.dwarf2/dw2-abs-hi-pc
(Mostly) an implementation of the user-space side of standard C/POSIX functions with Linux extensions.
A very unfortunate fact: glibc can only be built with
-O1. If you want to have an un-optimized debug build, deleting an object file
and recompiling it with
-g usually works. Another workaround is
#pragma GCC optimize ("O0").
-O2 issue is probably related to (1) expected inlining and (2) avoiding
Run the following commands to populate
/tmp/glibc-many with toolchains.
Caution: please make sure the target file system has tens of gigabytes.
scripts/build-many-glibcs.py /tmp/glibc-many checkout --shallow scripts/build-many-glibcs.py /tmp/glibc-many host-libraries scripts/build-many-glibcs.py /tmp/glibc-many compilers aarch64-linux-gnu scripts/build-many-glibcs.py /tmp/glibc-many compilers powerpc64le-linux-gnu scripts/build-many-glibcs.py /tmp/glibc-many compilers sparc64-linux-gnu
--depth 1to the git clone command.
--keepall keeps intermediary build directories intact. You may want this option to investigate build issues.
glibcs command will delete the glibc build directory, build glibc, and
scripts/build-many-glibcs.py /tmp/glibc-many glibcs aarch64-linux-gnu # Find the logs and test results under /tmp/glibc-many/logs/glibcs/aarch64-linux-gnu/ scripts/build-many-glibcs.py /tmp/glibc-many glibcs powerpc64le-linux-gnu scripts/build-many-glibcs.py /tmp/glibc-many glibcs sparc64-linux-gnu
“On build-many-glibcs.py and most stage1 compiler bootstrap, gcc is build statically against newlib. the static linked gcc (with a lot of disabled features) is then used to build glibc and then the stage2 gcc (which will then have all the features that rely on libc enabled) so the stage1 gcc might not have the require started files”
During development, some interesting targets:
make -C Debug check-abi
Building with Clang is not an option.
PRESERVE_BND_REGS_PREFIX: integrated assembler does not support the
sysdeps/powerpc/powerpc64/Makefile: Clang does not support
--disable-bootstrap is the most important, otherwise you will get a stage 2
build. It is not clear what make does when you touch a source file. It
definitely rebuilds stage1, but it is not clear to me how well stage2
dependency is handled. Anyway, touching a source file causes a total build is
not what you desire.
../configure --disable-bootstrap --enable-languages=c,c++ --disable-multilib make -j 30 # Incremental build make -C gcc cc1 cc1plus xgcc make -C x86_64-pc-linux-gnu/libstdc++-v3
Use built libstdc++ and libgcc.
$build/gcc/xg++ -B $build/release/gcc forced1.C -Wl,-rpath,$build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs,-rpath,$build/x86_64-pc-linux-gnu/libgcc
autotools, bison, m4, make, ...
GNU Coding Standards. Emacs has good built-in support. clang-format’s support is not as good.
Legally significant changes need Copyright Papers.