FS#71777 - [gcc] GCC is built with suboptimal CFLAGS / LDFLAGS

Attached to Project: Arch Linux
Opened by Toolybird (Toolybird) - Monday, 09 August 2021, 05:57 GMT
Last edited by freswa (frederik) - Thursday, 10 February 2022, 20:02 GMT
Task Type Bug Report
Category Packages: Core
Status Closed
Assigned To Giancarlo Razzolini (grazzolini)
freswa (frederik)
Architecture All
Severity Low
Priority Normal
Reported Version
Due in Version Undecided
Due Date Undecided
Percent Complete 100%
Votes 3
Private No

Details

Most of the installed binaries in an Arch GCC build are not compiled with preferred CFLAGS / LDFLAGS (from makepkg.conf). The reason is due to a combination of factors:

1. Arch uses the default Makefile target which performs a 3-stage bootstrap (3rd stage is what gets installed)
2. Arch doesn't employ the documented[1] BOOT_CFLAGS var, or the badly documented BOOT_LDFLAGS var.

Essentially, to pass preferred FLAGS passed down into the 2nd and 3rd stages of the bootstrap, one has to utilise BOOT_*FLAGS vars. This is what other distros do e.g: Fedora[2] and Debian[3]. (Sidenote: those links demonstrate why most of us appreciate the utter simplicity of PKGBUILDs :)

Now, just to complicate matters there are also *FLAGS_FOR_TARGET vars which affect how the target libraries get built.

In oversimplified terms the payload of a GCC build comprises of:

- compilers (gcc, g++, cpp, cc1, etc.)
- target libs (libgcc, libstdc++, and friends)

In the current Arch GCC build, CFLAGS are carried through to CFLAGS_FOR_TARGET. LDFLAGS are mostly lost (I say mostly because they do get used in certain less important parts of the build). BOOT_*FLAGS just get the defaults.

The upshot of all this means the status quo is as follows (using current distro FLAGS from devtools):

compilers:
BOOT_CFLAGS="-g -O2"
BOOT_LDFLAGS=""

target libs:
CFLAGS_FOR_TARGET="-g -march=x86-64 -mtune=generic -O2 -fno-plt"
(-g is added by GCC configury, -pipe is filtered out in PKGBUILD)
LDFLAGS_FOR_TARGET=""

This came to light while looking into ways to improve the bootstrap of the full Arch toolchain (see  FS#70954 ). Interestingly, if you build GCC with `--disable-bootstrap', the compilers *are* built with preferred CFLAGS / LDFLAGS but the target libs are the same. Also, I will note here it is possible to prove that a non-bootstrapped GCC can produce identical binaries to a bootstrapped one (I should post a separate write-up of this somewhere because it's a bit tricky).

Recommendations:
- build GCC with `make -O' (as per  FS#70871 ) in order to produce comprehensible log files
- add BOOT_CFLAGS, BOOT_LDFLAGS and LDFLAGS_FOR_TARGET to the make invocation
- while we're at it may as well add STAGE1_CFLAGS as per  FS#71476 

make -O STAGE1_CFLAGS="-O2" \
BOOT_CFLAGS="$CFLAGS" \
BOOT_LDFLAGS="$LDFLAGS" \
LDFLAGS_FOR_TARGET="$LDFLAGS"

I've tested this in a full toolchain bootstrap using latest binutils-2.37, gcc-11.2 and glibc-2.34. The GCC testsuite results are identical as compared to when not building like above. The target libs are all now full RELRO (except for libgcc_s.so.1 but this has now been fixed on GCC trunk[4]). Overall there are less complaints from namcap.

NOTE: If / when Arch changes the distro defaults in devtools to match current pacman makepkg.conf, certain CFLAGS will need to be filtered out. This is exacly what the Fedora rpm specfile does.

[1] https://gcc.gnu.org/install/build.html
[2] https://src.fedoraproject.org/rpms/gcc/blob/rawhide/f/gcc.spec
[3] https://salsa.debian.org/toolchain-team/gcc/-/blob/master/debian/rules2
[4] https://gcc.gnu.org/pipermail/gcc-patches/2021-August/576785.html
This task depends upon

Closed by  freswa (frederik)
Thursday, 10 February 2022, 20:02 GMT
Reason for closing:  Implemented
Additional comments about closing:  revision 436897
Comment by Allan McRae (Allan) - Monday, 09 August 2021, 07:55 GMT
Do you happen to have a collection of PKGBUILDs with all your fixes? I happy to review the changes in one go and pass them onto the current toolchain maintainer.
Comment by Toolybird (Toolybird) - Monday, 09 August 2021, 08:34 GMT
Yeah, sure thing. But I'm still workin on it :) I should figure out how to put stuff up on Github or somewhere..
Comment by Toolybird (Toolybird) - Wednesday, 11 August 2021, 06:06 GMT
Attached are some PKGBUILDs as requested. Can provide diffs instead if necessary. I have some other stuff in the pipeline but this is just the bare minimum fixes as recently reported.

Note: I've only build-tested these and run the testsuites in the standard nspawn container. Haven't actually installed the pkgs on a "real" system then built more software. Looking around the 'net, there are some issues with latest binutils and glibc. Subsequent patches will certainly be needed (as is typical for toolchain upgrades).