Re: [PATCH] libgcc: make heap-based trampolines conditional on libc presence
On Mon, Oct 23, 2023 at 6:41 PM Sergei Trofimovich wrote: > > On Mon, 23 Oct 2023 13:54:01 +0100 > Iain Sandoe wrote: > > > hi Sergei, > > > > > On 23 Oct 2023, at 13:43, Sergei Trofimovich wrote: > > > > > > From: Sergei Trofimovich > > > > > > 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 > > > | ^~ > > >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. > > Sounds good. Let's wait for others to chime in. Maybe Richard? :) OK. > AFAIU libcs (like `glibc`) try hard not to use link tests and uses > mainly preprocessor and code generator to specifically accommodate this > case. Maybe there is a way to pass the support flag to libc without the > reliance on code presence in libgcc. > > Otherwise we could use __builtin_trap() as an implementation for exposed > symbols. > > > > > > > > > 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 > > > #include > > > #include > > > @@ -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 > > > #include > > > #include > > > @@ -170,3 +173,5 @@ __builtin_nested_func_ptr_deleted (void) > > > tramp_ctrl_curr = prev; > > > } > >
Re: [PATCH] libgcc: make heap-based trampolines conditional on libc presence
On Mon, 23 Oct 2023 13:54:01 +0100 Iain Sandoe wrote: > hi Sergei, > > > On 23 Oct 2023, at 13:43, Sergei Trofimovich wrote: > > > > From: Sergei Trofimovich > > > > 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 > > | ^~ > >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. Sounds good. Let's wait for others to chime in. Maybe Richard? :) AFAIU libcs (like `glibc`) try hard not to use link tests and uses mainly preprocessor and code generator to specifically accommodate this case. Maybe there is a way to pass the support flag to libc without the reliance on code presence in libgcc. Otherwise we could use __builtin_trap() as an implementation for exposed symbols. > > > > > 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 > > #include > > #include > > @@ -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 > > #include > > #include > > @@ -170,3 +173,5 @@ __builtin_nested_func_ptr_deleted (void) > > tramp_ctrl_curr = prev; > > } > > } > > + > > +#endif /* !inhibit_libc */ > > -- > > 2.42.0 > > > -- Sergei
Re: [PATCH] libgcc: make heap-based trampolines conditional on libc presence
hi Sergei, > On 23 Oct 2023, at 13:43, Sergei Trofimovich wrote: > > From: Sergei Trofimovich > > 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 > | ^~ >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 > #include > #include > @@ -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 > #include > #include > @@ -170,3 +173,5 @@ __builtin_nested_func_ptr_deleted (void) > tramp_ctrl_curr = prev; > } > } > + > +#endif /* !inhibit_libc */ > -- > 2.42.0 >
[PATCH] libgcc: make heap-based trampolines conditional on libc presence
From: Sergei Trofimovich 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 | ^~ 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. 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 #include #include @@ -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 #include #include @@ -170,3 +173,5 @@ __builtin_nested_func_ptr_deleted (void) tramp_ctrl_curr = prev; } } + +#endif /* !inhibit_libc */ -- 2.42.0