On Mon, Oct 23, 2023 at 6:41 PM Sergei Trofimovich <sly...@gmail.com> wrote:
>
> On Mon, 23 Oct 2023 13:54:01 +0100
> Iain Sandoe <i...@sandoe.co.uk> wrote:
>
> > 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.
>
> 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

Reply via email to