Messages in this thread | | | From | Kees Cook <> | Date | Sun, 19 Aug 2018 14:23:49 -0700 | Subject | Re: Build failures with gcc 4.5 and older |
| |
On Tue, Aug 14, 2018 at 10:48 AM, Joe Perches <joe@perches.com> wrote: > On Tue, 2018-08-14 at 10:09 -0700, Guenter Roeck wrote: >> Hi, >> >> Since commit c1a2f7f0c0645 ("mm: Allocate the mm_cpumask >> (mm->cpu_bitmap[]) dynamically based on nr_cpu_ids"), building >> the Linux kernel with gcc version 4.5 and older fails as follows. >> >> In file included from ./include/linux/mm.h:17:0, >> from ./include/linux/pid_namespace.h:7, >> from ./include/linux/ptrace.h:10, >> from arch/openrisc/kernel/asm-offsets.c:32: >> ./include/linux/mm_types.h:497:16: error: flexible array member in otherwise empty struct >> >> This is just an example with gcc 4.5.1 for or32. I have seen the problem >> with gcc 4.4 (for unicore32) as well. >> >> Does that mean that gcc 4.5 and older are now officially no longer >> supported for compiling the kernel ? >> >> If so, would it make sense to update include/linux/compiler-gcc.h >> accordingly ? > > And Documentation/process/changes.rst which shows a > minimum version required of gcc as 3.2, etc... > > With cleaning up now unnecessary version tests in > compiler-gcc.h, something like:
I rejoice at raising the minimum gcc to version 4.6! :)
> --- > Documentation/process/changes.rst | 2 +- > include/linux/compiler-gcc.h | 86 ++++++++------------------------------- > 2 files changed, 19 insertions(+), 69 deletions(-)
These look good, thanks:
Reviewed-by: Kees Cook <keescook@chromium.org>
-Kees
> > diff --git a/Documentation/process/changes.rst b/Documentation/process/changes.rst > index 7a92a06f90de..61f918b10a0c 100644 > --- a/Documentation/process/changes.rst > +++ b/Documentation/process/changes.rst > @@ -29,7 +29,7 @@ you probably needn't concern yourself with isdn4k-utils. > ====================== =============== ======================================== > Program Minimal version Command to check the version > ====================== =============== ======================================== > -GNU C 3.2 gcc --version > +GNU C 4.6 gcc --version > GNU make 3.81 make --version > binutils 2.20 ld -v > flex 2.5.35 flex --version > diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h > index 573f5a7d42d4..020e4b9eee5c 100644 > --- a/include/linux/compiler-gcc.h > +++ b/include/linux/compiler-gcc.h > @@ -10,6 +10,10 @@ > + __GNUC_MINOR__ * 100 \ > + __GNUC_PATCHLEVEL__) > > +#if GCC_VERSION < 40600 > +# error Sorry, your compiler is too old - please upgrade it. > +#endif > + > /* Optimization barrier */ > > /* The "volatile" is due to gcc bugs */ > @@ -58,6 +62,12 @@ > #define OPTIMIZER_HIDE_VAR(var) \ > __asm__ ("" : "=r" (var) : "0" (var)) > > +/* > + * A trick to suppress uninitialized variable warning without generating any > + * code > + */ > +#define uninitialized_var(x) x = x > + > #ifdef __CHECKER__ > #define __must_be_array(a) 0 > #else > @@ -91,7 +101,7 @@ > * A lot of inline functions can cause havoc with function tracing. > */ > #if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \ > - !defined(CONFIG_OPTIMIZE_INLINING) || (__GNUC__ < 4) > + !defined(CONFIG_OPTIMIZE_INLINING) > #define inline \ > inline __attribute__((always_inline, unused)) notrace __gnu_inline > #else > @@ -148,47 +158,13 @@ > #define __always_unused __attribute__((unused)) > #define __mode(x) __attribute__((mode(x))) > > -/* gcc version specific checks */ > - > -#if GCC_VERSION < 30200 > -# error Sorry, your compiler is too old - please upgrade it. > -#endif > - > -#if GCC_VERSION < 30300 > -# define __used __attribute__((__unused__)) > -#else > -# define __used __attribute__((__used__)) > -#endif > - > -#ifdef CONFIG_GCOV_KERNEL > -# if GCC_VERSION < 30400 > -# error "GCOV profiling support for gcc versions below 3.4 not included" > -# endif /* __GNUC_MINOR__ */ > -#endif /* CONFIG_GCOV_KERNEL */ > - > -#if GCC_VERSION >= 30400 > #define __must_check __attribute__((warn_unused_result)) > #define __malloc __attribute__((__malloc__)) > -#endif > - > -#if GCC_VERSION >= 40000 > - > -/* GCC 4.1.[01] miscompiles __weak */ > -#ifdef __KERNEL__ > -# if GCC_VERSION >= 40100 && GCC_VERSION <= 40101 > -# error Your version of gcc miscompiles the __weak directive > -# endif > -#endif > > #define __used __attribute__((__used__)) > #define __compiler_offsetof(a, b) \ > __builtin_offsetof(a, b) > > -#if GCC_VERSION >= 40100 > -# define __compiletime_object_size(obj) __builtin_object_size(obj, 0) > -#endif > - > -#if GCC_VERSION >= 40300 > /* Mark functions as cold. gcc will assume any path leading to a call > * to them will be unlikely. This means a lot of manual unlikely()s > * are unnecessary now for any paths leading to the usual suspects > @@ -207,24 +183,19 @@ > > #define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__) > > -#ifndef __CHECKER__ > -# define __compiletime_warning(message) __attribute__((warning(message))) > -# define __compiletime_error(message) __attribute__((error(message))) > -#endif /* __CHECKER__ */ > -#endif /* GCC_VERSION >= 40300 */ > - > -#if GCC_VERSION >= 40400 > #define __optimize(level) __attribute__((__optimize__(level))) > #define __nostackprotector __optimize("no-stack-protector") > -#endif /* GCC_VERSION >= 40400 */ > > -#if GCC_VERSION >= 40500 > +#define __compiletime_object_size(obj) __builtin_object_size(obj, 0) > > #ifndef __CHECKER__ > +#define __compiletime_warning(message) __attribute__((warning(message))) > +#define __compiletime_error(message) __attribute__((error(message))) > + > #ifdef LATENT_ENTROPY_PLUGIN > #define __latent_entropy __attribute__((latent_entropy)) > #endif > -#endif > +#endif /* __CHECKER__ */ > > /* > * calling noreturn functions, __builtin_unreachable() and __builtin_trap() > @@ -262,10 +233,6 @@ > #define randomized_struct_fields_end } __randomize_layout; > #endif > > -#endif /* GCC_VERSION >= 40500 */ > - > -#if GCC_VERSION >= 40600 > - > /* > * When used with Link Time Optimization, gcc can optimize away C functions or > * variables which are referenced only from assembly code. __visible tells the > @@ -274,8 +241,7 @@ > */ > #define __visible __attribute__((externally_visible)) > > -#endif /* GCC_VERSION >= 40600 */ > - > +/* gcc version specific checks */ > > #if GCC_VERSION >= 40900 && !defined(__CHECKER__) > /* > @@ -309,10 +275,8 @@ > * folding in __builtin_bswap*() (yet), so don't set these for it. > */ > #if defined(CONFIG_ARCH_USE_BUILTIN_BSWAP) && !defined(__CHECKER__) > -#if GCC_VERSION >= 40400 > #define __HAVE_BUILTIN_BSWAP32__ > #define __HAVE_BUILTIN_BSWAP64__ > -#endif > #if GCC_VERSION >= 40800 > #define __HAVE_BUILTIN_BSWAP16__ > #endif > @@ -341,10 +305,9 @@ > * https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html > */ > #define __designated_init __attribute__((designated_init)) > +#define COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW 1 > #endif > > -#endif /* gcc version >= 40000 specific checks */ > - > #if !defined(__noclone) > #define __noclone /* not needed */ > #endif > @@ -353,16 +316,6 @@ > #define __no_sanitize_address > #endif > > -/* > - * A trick to suppress uninitialized variable warning without generating any > - * code > - */ > -#define uninitialized_var(x) x = x > - > -#if GCC_VERSION >= 50100 > -#define COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW 1 > -#endif > - > /* > * Turn individual warnings and errors on and off locally, depending > * on version. > @@ -375,12 +328,9 @@ > #define __diag_GCC_warn warning > #define __diag_GCC_error error > > -/* Compilers before gcc-4.6 do not understand "#pragma GCC diagnostic push" */ > -#if GCC_VERSION >= 40600 > #define __diag_str1(s) #s > #define __diag_str(s) __diag_str1(s) > #define __diag(s) _Pragma(__diag_str(GCC diagnostic s)) > -#endif > > #if GCC_VERSION >= 80000 > #define __diag_GCC_8(s) __diag(s) > > >
-- Kees Cook Pixel Security
| |