hi Sergei, > On 23 Oct 2023, at 13:43, Sergei Trofimovich <sly...@gmail.com> wrote: > > From: Sergei Trofimovich <siarh...@google.com> > > To build `libc` for a target one needs to build `gcc` without `libc` > support first. Commit r14-4823-g8abddb187b3348 "libgcc: support > heap-based trampolines" added unconditional `libc` dependency and broke > libc-less `gcc` builds. > > An example failure on `x86_64-unknown-linux-gnu`: > > $ mkdir -p /tmp/empty > $ ../gcc/configure \ > --disable-multilib \ > --without-headers \ > --with-newlib \ > --enable-languages=c \ > --disable-bootstrap \ > --disable-gcov \ > --disable-threads \ > --disable-shared \ > --disable-libssp \ > --disable-libquadmath \ > --disable-libgomp \ > --disable-libatomic \ > --with-build-sysroot=/tmp/empty > $ make > ... > /tmp/gb/./gcc/xgcc -B/tmp/gb/./gcc/ -B/usr/local/x86_64-pc-linux-gnu/bin/ > -B/usr/local/x86_64-pc-linux-gnu/lib/ -isystem > /usr/local/x86_64-pc-linux-gnu/include -isystem > /usr/local/x86_64-pc-linux-gnu/sys-include --sysroot=/tmp/empty -g -O2 -O2 > -g -O2 -DIN_GCC -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual > -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition -isystem > ./include -fpic -mlong-double-80 -DUSE_ELF_SYMVER -fcf-protection -mshstk -g > -DIN_LIBGCC2 -fbuilding-libgcc -fno-stack-protector -Dinhibit_libc -fpic > -mlong-double-80 -DUSE_ELF_SYMVER -fcf-protection -mshstk -I. -I. > -I../.././gcc -I/home/slyfox/dev/git/gcc/libgcc > -I/home/slyfox/dev/git/gcc/libgcc/. -I/home/slyfox/dev/git/gcc/libgcc/../gcc > -I/home/slyfox/dev/git/gcc/libgcc/../include -DHAVE_CC_TLS -DUSE_TLS -o > heap-trampoline.o -MT heap-trampoline.o -MD -MP -MF heap-trampoline.dep -c > .../gcc/libgcc/config/i386/heap-trampoline.c -fvisibility=hidden > -DHIDE_EXPORTS > ../gcc/libgcc/config/i386/heap-trampoline.c:3:10: fatal error: unistd.h: > No such file or directory > 3 | #include <unistd.h> > | ^~~~~~~~~~ > compilation terminated. > make[2]: *** [.../gcc/libgcc/static-object.mk:17: heap-trampoline.o] Error > 1 > make[2]: Leaving directory '/tmp/gb/x86_64-pc-linux-gnu/libgcc' > make[1]: *** [Makefile:13307: all-target-libgcc] Error 2 > > The change inhibits any heap-based trampoline code.
That looks reasonable to me (I was considering using __has_include(), but the inhibit_libc is neater). The fact that this first compiler is buit without heap-trampoline support, would become relevant, I guess if libc wanted to use them, it would need another iteration. so, it looks fine, but I cannot actually approve it. Iain > > libgcc/ > > * libgcc/config/aarch64/heap-trampoline.c: Disable when libc is > not present. > --- > libgcc/config/aarch64/heap-trampoline.c | 5 +++++ > libgcc/config/i386/heap-trampoline.c | 5 +++++ > 2 files changed, 10 insertions(+) > > diff --git a/libgcc/config/aarch64/heap-trampoline.c > b/libgcc/config/aarch64/heap-trampoline.c > index c8b83681ed7..f22233987ca 100644 > --- a/libgcc/config/aarch64/heap-trampoline.c > +++ b/libgcc/config/aarch64/heap-trampoline.c > @@ -1,5 +1,8 @@ > /* Copyright The GNU Toolchain Authors. */ > > +/* libc is required to allocate trampolines. */ > +#ifndef inhibit_libc > + > #include <unistd.h> > #include <sys/mman.h> > #include <stdint.h> > @@ -170,3 +173,5 @@ __builtin_nested_func_ptr_deleted (void) > tramp_ctrl_curr = prev; > } > } > + > +#endif /* !inhibit_libc */ > diff --git a/libgcc/config/i386/heap-trampoline.c > b/libgcc/config/i386/heap-trampoline.c > index 96e13bf828e..4b9f4365868 100644 > --- a/libgcc/config/i386/heap-trampoline.c > +++ b/libgcc/config/i386/heap-trampoline.c > @@ -1,5 +1,8 @@ > /* Copyright The GNU Toolchain Authors. */ > > +/* libc is required to allocate trampolines. */ > +#ifndef inhibit_libc > + > #include <unistd.h> > #include <sys/mman.h> > #include <stdint.h> > @@ -170,3 +173,5 @@ __builtin_nested_func_ptr_deleted (void) > tramp_ctrl_curr = prev; > } > } > + > +#endif /* !inhibit_libc */ > -- > 2.42.0 >