Re: [PATCH v2 1/6] Fix gen-as-const-headers races with the parallel subdir recursion (BZ 34438)
Sam James <[email protected]> Thu, 06 Aug 2026 19:02:38 +0100
| Newsgroups | gmane.comp.lib.glibc.alpha |
|---|---|
| Organization | Gentoo |
| Message-ID | <[email protected]> |
Adhemerval Zanella <[email protected]> writes: > The parallel subdirectory recursion (commit 7cac99621e96) only orders > csu (and mach/hurd on Hurd) before the parallel fan-out plus the edges > the Depend files request. A header generated from gen-as-const-headers > is only ordered before the compilations of the subdirectory that > adds the .sym (through before-compile), so a header consumed by a > different subdirectory may not exist yet when its consumer is > compiled. > > That is the case for <sigaltstack-offsets.h>: it is generated when > building misc, while its only consumer, ____longjmp_chk.S (x86_64 and > sh), is built in debug. The serial recursion always ran misc before > debug in the sorted order, hiding the missing dependency. > > Move the generate the header to 'debug' instead. > > The same class of problem exists on Hurd: jmp_buf-ssp.h that is used > by ____longjmp_chk.S in debug, and signal-defines.h that is sued > by debug and setjmp. > > Deterministically reproduced with 'make debug/subdir_lib' from a clean > build tree (which orders only csu before debug), and verified with > builds for x86_64-linux-gnu, sh4-linux-gnu, i686-gnu, and x86_64-gnu. Reviewed-by: Sam James <[email protected]> > --- > Makerules | 12 +++++++++++- > sysdeps/mach/hurd/x86/Makefile | 6 +----- > sysdeps/unix/sysv/linux/sh/Makefile | 4 +++- > sysdeps/unix/sysv/linux/x86_64/Makefile | 4 +++- > sysdeps/x86/Makefile | 10 ++++++++-- > 5 files changed, 26 insertions(+), 10 deletions(-) > > diff --git a/Makerules b/Makerules > index 6bef57ece93..cef30974f15 100644 > --- a/Makerules > +++ b/Makerules > @@ -259,7 +259,17 @@ endif # gen-py-const-headers > ifdef gen-as-const-headers > # Generating headers for assembly constants. > # We need this defined early to get into before-compile before > -# it's used in sysd-rules, below. > +# it's used in sysd-rules, below. The gen-as-const-headers is evaluated > +# per subdirectory, so the before-compile dependency below only orders > +# the generated header before the compiles of the subdirectory whose > +# Makefile adds the .sym directive. > +# The parallel subdirectory recursion does not order sibling subdirectories, > +# so a .sym must be added in the subdirectory that compiles its consumers, > +# or in csu (which runs before the parallel) when it has consumers in > +# several subdirectories. > +# It must not add the same .sym in several subdirectories though: their > +# concurrent sub-makes would race generating the header through the fixed > +# temporary files below. > # Define GEN_AS_CONST_HEADERS to avoid circular dependency [BZ #22792]. > # NB: <tcb-offsets.h> is generated from tcb-offsets.sym to define > # offsets and sizes of types in <tls.h> and maybe <pthread.h> which > diff --git a/sysdeps/mach/hurd/x86/Makefile b/sysdeps/mach/hurd/x86/Makefile > index 97e3287c873..1d94f3a1c16 100644 > --- a/sysdeps/mach/hurd/x86/Makefile > +++ b/sysdeps/mach/hurd/x86/Makefile > @@ -3,11 +3,7 @@ sysdep_routines += ioperm > sysdep_headers += sys/io.h > endif > > -ifeq ($(subdir),debug) > -gen-as-const-headers += signal-defines.sym > -endif > - > -ifeq ($(subdir),setjmp) > +ifeq ($(subdir),csu) > gen-as-const-headers += signal-defines.sym > endif > > diff --git a/sysdeps/unix/sysv/linux/sh/Makefile b/sysdeps/unix/sysv/linux/sh/Makefile > index dd3b382ac10..8c4cb73824f 100644 > --- a/sysdeps/unix/sysv/linux/sh/Makefile > +++ b/sysdeps/unix/sysv/linux/sh/Makefile > @@ -6,7 +6,9 @@ ifeq ($(subdir),stdlib) > gen-as-const-headers += ucontext_i.sym > endif > > -ifeq ($(subdir),misc) > +# <sigaltstack-offsets.h> is only used by ____longjmp_chk.S, which is > +# built in the debug subdirectory. > +ifeq ($(subdir),debug) > gen-as-const-headers += sigaltstack-offsets.sym > endif > > diff --git a/sysdeps/unix/sysv/linux/x86_64/Makefile b/sysdeps/unix/sysv/linux/x86_64/Makefile > index 6938382801f..528fd951b2d 100644 > --- a/sysdeps/unix/sysv/linux/x86_64/Makefile > +++ b/sysdeps/unix/sysv/linux/x86_64/Makefile > @@ -10,7 +10,9 @@ ifeq ($(subdir),csu) > gen-as-const-headers += ucontext_i.sym > endif > > -ifeq ($(subdir),misc) > +# <sigaltstack-offsets.h> is only used by ____longjmp_chk.S, which is > +# built in the debug subdirectory. > +ifeq ($(subdir),debug) > gen-as-const-headers += sigaltstack-offsets.sym > endif > > diff --git a/sysdeps/x86/Makefile b/sysdeps/x86/Makefile > index 232e388d325..b4434deb0c3 100644 > --- a/sysdeps/x86/Makefile > +++ b/sysdeps/x86/Makefile > @@ -1,5 +1,12 @@ > ifeq ($(subdir),csu) > -gen-as-const-headers += cpu-features-offsets.sym features-offsets.sym > +# <jmp_buf-ssp.h> is used by the setjmp/longjmp implementations in the > +# setjmp subdirectory and also by ____longjmp_chk.S in the debug > +# subdirectory. > +gen-as-const-headers += \ > + cpu-features-offsets.sym \ > + features-offsets.sym \ > + jmp_buf-ssp.sym \ > + # gen-as-const-headers > endif > > ifeq ($(subdir),elf) > @@ -171,7 +178,6 @@ tests += \ > endif # $(subdir) == math > > ifeq ($(subdir),setjmp) > -gen-as-const-headers += jmp_buf-ssp.sym > sysdep_routines += __longjmp_cancel > endif
signature.asc
(application/pgp-signature, 418 B)
-----BEGIN PGP SIGNATURE----- iQEBBAEWCgCpFiEEJaa7iN2bdkxrVUHCc4QJ9SDfkZAFAmp0zGwbFIAAAAAABAAO bWFudTIsMi41KzEuMTIsMiwyXxSAAAAAAC4AKGlzc3Vlci1mcHJAbm90YXRpb25z Lm9wZW5wZ3AuZmlmdGhob3JzZW1hbi5uZXQyNUE2QkI4OEREOUI3NjRDNkI1NTQx QzI3Mzg0MDlGNTIwREY5MTkwDxxzYW1AZ2VudG9vLm9yZwAKCRBzhAn1IN+RkGz4 AP48lEKZtsdQBKV8soZN29Uk9j/XocLpRsmhRoIKfWT8twD/aQgp4cn2o6/RJ8R/ j4r3hasZKDZtxZF5+fTBkmmFoAQ= =0PK9 -----END PGP SIGNATURE-----