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.
binutils
- Repository: https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git
- Mailing list: https://sourceware.org/pipermail/binutils
- Bugzilla: https://sourceware.org/bugzilla/
- Main tools: as (
gas/
, GNU assembler), ld (ld/
, GNU ld), gold (gold/
, GNU gold)
As of 2021-01, it has no wiki.
Target all
builds targets all-host
and 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 --disable-*
. --enable-gold
is needed to enable gold.
1 | mkdir Debug; cd Debug |
For cross compiling, make sure your have $target-{gcc,as,ld}
.
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.
1 |
|
Build with Clang:
1 | mkdir -p out/clang-debug; cd out/clang-debug |
Test
GNU Test Framework DejaGnu is based on Expect, which is in turn based on Tcl.
To run tests:
1 | make -C Debug check-binutils |
For ld, tests are listed in .exp
files under ld/testsuite
. A single test normally consists of a .d
file and several associated .s
files.
To run the tests in ld/testsuite/ld-shared/shared.exp
:
1 | make -C Debug check-ld RUNTESTFLAGS=ld-shared/shared.exp |
Misc
- A bot updates
bfd/version.h
(BFD_VERSION_DATE
) daily. - Test coverage is low.
gdb
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:
1 | gdb/gdb -data-directory gdb/data-directory |
To run the tests in gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc.exp
:
1 | make check-gdb RUNTESTFLAGS=gdb.dwarf2/dw2-abs-hi-pc.exp |
glibc
- Repository: https://sourceware.org/git/gitweb.cgi?p=glibc.git
- Wiki: https://sourceware.org/glibc/wiki/
- Bugzilla: https://sourceware.org/bugzilla/
- Mailing lists:
{libc-announce,libc-alpha,libc-locale,libc-stable,libc-help}@sourceware.org
(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 -O2
, not -O0
or -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")
.
The -O2
issue is probably related to (1) expected inlining and (2) avoiding dynamic relocations.
Run the following commands to populate /tmp/glibc-many
with toolchains. Caution: please make sure the target file system has tens of gigabytes.
Preparation:
1 | scripts/build-many-glibcs.py /tmp/glibc-many checkout --shallow |
--shallow
passes--depth 1
to the git clone command.--keep all
keeps intermediary build directories intact. You may want this option to investigate build issues.
The glibcs
command will delete the glibc build directory, build glibc, and run make check
.
1 | scripts/build-many-glibcs.py /tmp/glibc-many glibcs aarch64-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:
1 | make -C Debug check-abi |
Building with Clang is not an option.
- Clang does not support GCC nested functions BZ #27220
- x86
PRESERVE_BND_REGS_PREFIX
: integrated assembler does not support thebnd
prefix. sysdeps/powerpc/powerpc64/Makefile
: Clang does not support-ffixed-vrsave -ffixed-vscr
GCC
--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.
1 | ../configure --disable-bootstrap --enable-languages=c,c++ --disable-multilib |
Use built libstdc++ and libgcc.
1 | $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 |
Misc
- A bot updates
ChangeLog
files daily.Daily bump.
Unlisted
autotools, bison, m4, make, ...
Contributing
Free Software Foundation Copyright Assignment