From b6b3cdc16eaa50b40623f1589ea51dd43ebb456d Mon Sep 17 00:00:00 2001 From: Eneas U de Queiroz Date: Fri, 8 Oct 2021 14:47:08 -0300 Subject: [PATCH 2/2] Fix compilation with gcc11 Currently, libbb.h counts on __THROW and __inline being defined. They are internal macros used by glibc not meant to be publicly used. This causes trouble, at least with a combination of gcc11 and musl, where nether have them defined. Use definitions from in gcc 8.4.0 if they're missing. Signed-off-by: Eneas U de Queiroz --- a/include/libbb.h +++ b/include/libbb.h @@ -120,6 +120,65 @@ #ifdef DMALLOC # include #endif + +/* Compatibility with musl & gcc 11. Taken from in gcc 8.4.0 */ +#ifndef __THROW +#ifdef __GNUC__ + +/* All functions, except those with callbacks or those that + synchronize memory, are leaf functions. */ +# if __GNUC_PREREQ (4, 6) && !defined _LIBC +# define __LEAF , __leaf__ +# define __LEAF_ATTR __attribute__ ((__leaf__)) +# else +# define __LEAF +# define __LEAF_ATTR +# endif + +/* GCC can always grok prototypes. For C++ programs we add throw() + to help it optimize the function calls. But this works only with + gcc 2.8.x and egcs. For gcc 3.2 and up we even mark C functions + as non-throwing using a function attribute since programs can use + the -fexceptions options for C code as well. */ +# if !defined __cplusplus && __GNUC_PREREQ (3, 3) +# define __THROW __attribute__ ((__nothrow__ __LEAF)) +# define __THROWNL __attribute__ ((__nothrow__)) +# define __NTH(fct) __attribute__ ((__nothrow__ __LEAF)) fct +# else +# if defined __cplusplus && __GNUC_PREREQ (2,8) +# define __THROW throw () +# define __THROWNL throw () +# define __NTH(fct) __LEAF_ATTR fct throw () +# else +# define __THROW +# define __THROWNL +# define __NTH(fct) fct +# endif +# endif + +#else /* Not GCC. */ + +# define __inline /* No inline functions. */ + +# define __THROW +# define __THROWNL +# define __NTH(fct) fct + +#endif /* GCC. */ +#endif /* __THROW */ + +#ifndef __nonnull +/* The nonull function attribute allows to mark pointer parameters which + must not be NULL. */ +#if __GNUC_PREREQ (3,3) +# define __nonnull(params) __attribute__ ((__nonnull__ params)) +#else +# define __nonnull(params) +#endif +#endif /* __nonnull */ + +/* End of compatibility with musl & gcc 11. */ + /* Just in case libc doesn't define some of these... */ #ifndef _PATH_PASSWD #define _PATH_PASSWD "/etc/passwd"