On Tue, Aug 17, 2021 at 1:43 AM Sebastian Huber <sebastian.hu...@embedded-brains.de> wrote: > > abort() is used in gcc_assert() and gcc_unreachable() which is used by target > libraries such as libgcov.a. This patch changes the abort() definition under > certain conditions. If inhibit_libc is defined and abort is not already > defined, then abort() is defined to __builtin_trap(). > > The inhibit_libc define is usually defined if GCC is built for targets running > in embedded systems which may optionally use a C standard library. If > inhibit_libc is defined, then there may be still a full featured abort() > available. abort() is a heavy weight function which depends on signals and > file streams. For statically linked applications, this means that a > dependency > on gcc_assert() pulls in the support for signals and file streams. This could > prevent using gcov to test low end targets for example. Using > __builtin_trap() > avoids these dependencies if the target implements a "trap" instruction. The > application or operating system could use a trap handler to react to failed > GCC > runtime checks which caused a trap.
This also breaks sometimes compiling of emutls.c on some targets like uclibc ... See https://gcc.gnu.org/PR110775 for some more details there. Thanks, Andrew > > gcc/ > > * tsystem.h (abort): Define abort() if inhibit_libc is defined and it > is not already defined. > --- > gcc/tsystem.h | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/gcc/tsystem.h b/gcc/tsystem.h > index e1e6a96a4f48..5c72c69ff3ed 100644 > --- a/gcc/tsystem.h > +++ b/gcc/tsystem.h > @@ -59,7 +59,7 @@ extern int atexit (void (*)(void)); > #endif > > #ifndef abort > -extern void abort (void) __attribute__ ((__noreturn__)); > +#define abort() __builtin_trap () > #endif > > #ifndef strlen > -- > 2.26.2 >