A gcc built against glibc-2.30 (and some earlier releases) will fixinclude <bits/statx.h> and store a modified copy in its installation. This copy differs from glibc's as follows: @@ -1,3 +1,12 @@ +/* DO NOT EDIT THIS FILE. + + It has been auto-edited by fixincludes from: + + "/tmp/cross-x86_64/usr/include/bits/statx.h" + + This had to be done to correct non-standard usages in the + original, manufacturer supplied header file. */ + /* statx-related definitions and declarations. Linux version. Copyright (C) 2018-2019 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -26,7 +35,7 @@ /* Use "" to work around incorrect macro expansion of the __has_include argument (GCC PR 80005). */ -#if __glibc_has_include ("linux/stat.h") +#if __glibc_has_include ("__linux__/stat.h") # include "linux/stat.h" # ifdef STATX_TYPE # define __statx_timestamp_defined 1 The incorrect replacement of linux with __linux__ is tracked as PR91085, but that is not the issue reported here. Now assume this compiler installation is used with glibc-2.31 (for instance, due to an OS upgrade), and try to compile the following: > cat test.c #define _GNU_SOURCE #include <sys/stat.h> int main (void) { return 0; } > /tmp/cross-x86_64/bin/x86_64-unknown-linux-gcc -Wall -O2 -c test.c In file included from /tmp/cross-x86_64/usr/include/sys/stat.h:446, from test.c:2: /tmp/cross-x86_64/lib/gcc/x86_64-unknown-linux/8.4.0/include-fixed/bits/statx.h:38:25: error: missing binary operator before token "(" #if __glibc_has_include ("__linux__/stat.h") This error occurs because the fixincluded <bits/statx.h> refers to the __glibc_had_include () macro which was removed in glibc-2.31. If this gcc is now used to bootstrap another on on the glibc-2.31 system, lots of configure tests fail, and the build errors out in libiberty: gcc -c -DHAVE_CONFIG_H -g -I. -I/tmp/gcc-9.3.0-RC-20200305/libiberty/../include -W -Wall -Wwrite-strings -Wc++-compat -Wstrict-prototypes -Wshadow=local -pedantic -D_GNU_SOURCE -fpic /tmp/gcc-9.3.0-RC-20200305/libiberty/regex.c -o pic/regex.o; \ else true; fi In file included from /tmp/gcc-9.3.0-RC-20200305/libiberty/regex.c:38: ./config.h:568:15: error: two or more data types in declaration specifiers #define pid_t int ^~~ ./config.h:571:17: error: two or more data types in declaration specifiers #define ssize_t int ^~~ make[3]: *** [Makefile:1167: regex.o] Error 1 make[3]: Leaving directory '/tmp/objdir/libiberty' make[2]: *** [Makefile:11197: all-stage1-libiberty] Error 2 make[2]: Leaving directory '/tmp/objdir' make[1]: *** [Makefile:21422: stage1-bubble] Error 2 make[1]: Leaving directory '/tmp/objdir' make: *** [Makefile:993: all] Error 2 This error is the result of configure tests that failed due to direct or indirect includes of <sys/stat.h>. This is what I noticed after an upgrade from Fedora 30 to Fedora 31: my existing gcc:s could no longer bootstrap new ones. While one could argue that glibc-2.31 was in error to remove the __glibc_has_include () macro, gcc is also in error for creating that unnecessary dependency in the first place: it should not have fixincluded <bits/statx.h>. The error is easily reproduced by building a cross with glibc-2.30 and then updating it to glibc-2.31 (which is why some of the samples above mention a cross rather than a native compiler).
If you use a gcc with a different glibc, you need to rerun fixincludes. Fixincludes is installed too.