* [PATCH] libgcc: make heap-based trampolines conditional on libc presence
@ 2023-10-23 12:43 Sergei Trofimovich
2023-10-23 12:54 ` Iain Sandoe
0 siblings, 1 reply; 4+ messages in thread
From: Sergei Trofimovich @ 2023-10-23 12:43 UTC (permalink / raw)
To: gcc-patches
Cc: Andrew Burgess, Maxim Blinov, Iain Sandoe,
Francois-Xavier Coudert, Sergei Trofimovich, Sergei Trofimovich
From: Sergei Trofimovich <siarheit@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.
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
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] libgcc: make heap-based trampolines conditional on libc presence
2023-10-23 12:43 [PATCH] libgcc: make heap-based trampolines conditional on libc presence Sergei Trofimovich
@ 2023-10-23 12:54 ` Iain Sandoe
2023-10-23 16:39 ` Sergei Trofimovich
0 siblings, 1 reply; 4+ messages in thread
From: Iain Sandoe @ 2023-10-23 12:54 UTC (permalink / raw)
To: Sergei Trofimovich
Cc: GCC Patches, Francois-Xavier Coudert, Sergei Trofimovich
hi Sergei,
> On 23 Oct 2023, at 13:43, Sergei Trofimovich <slyich@gmail.com> wrote:
>
> From: Sergei Trofimovich <siarheit@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
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] libgcc: make heap-based trampolines conditional on libc presence
2023-10-23 12:54 ` Iain Sandoe
@ 2023-10-23 16:39 ` Sergei Trofimovich
2023-10-24 7:18 ` Richard Biener
0 siblings, 1 reply; 4+ messages in thread
From: Sergei Trofimovich @ 2023-10-23 16:39 UTC (permalink / raw)
To: Iain Sandoe
Cc: GCC Patches, Francois-Xavier Coudert, Sergei Trofimovich, Richard Biener
On Mon, 23 Oct 2023 13:54:01 +0100
Iain Sandoe <iain@sandoe.co.uk> wrote:
> hi Sergei,
>
> > On 23 Oct 2023, at 13:43, Sergei Trofimovich <slyich@gmail.com> wrote:
> >
> > From: Sergei Trofimovich <siarheit@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.
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 <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
> >
>
--
Sergei
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] libgcc: make heap-based trampolines conditional on libc presence
2023-10-23 16:39 ` Sergei Trofimovich
@ 2023-10-24 7:18 ` Richard Biener
0 siblings, 0 replies; 4+ messages in thread
From: Richard Biener @ 2023-10-24 7:18 UTC (permalink / raw)
To: Sergei Trofimovich
Cc: Iain Sandoe, GCC Patches, Francois-Xavier Coudert, Sergei Trofimovich
On Mon, Oct 23, 2023 at 6:41 PM Sergei Trofimovich <slyich@gmail.com> wrote:
>
> On Mon, 23 Oct 2023 13:54:01 +0100
> Iain Sandoe <iain@sandoe.co.uk> wrote:
>
> > hi Sergei,
> >
> > > On 23 Oct 2023, at 13:43, Sergei Trofimovich <slyich@gmail.com> wrote:
> > >
> > > From: Sergei Trofimovich <siarheit@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.
>
> 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 <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
> > >
> >
>
>
> --
>
> Sergei
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2023-10-24 7:18 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-10-23 12:43 [PATCH] libgcc: make heap-based trampolines conditional on libc presence Sergei Trofimovich
2023-10-23 12:54 ` Iain Sandoe
2023-10-23 16:39 ` Sergei Trofimovich
2023-10-24 7:18 ` Richard Biener
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).