From 8174bad3da8eb26ad08f60790adeb66067775359 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Sun, 21 Jun 2020 16:07:16 +0000 Subject: [PATCH] scripts/kernel-functions: Make it possible to build older kernels with gcc 10 git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9027 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- scripts/kernel-functions | 128 +++++++++++++++++++++++++++++------ scripts/run-regression-tests | 12 +--- 2 files changed, 109 insertions(+), 31 deletions(-) diff --git a/scripts/kernel-functions b/scripts/kernel-functions index bab8c2c60..249fc0487 100644 --- a/scripts/kernel-functions +++ b/scripts/kernel-functions @@ -127,15 +127,20 @@ function extract_kernel_tree { # Patch a kernel tree where $1 is the kernel version. function patch_kernel { - case "$k" in + case "$1" in *^*) # RHEL / CentOS. ;; - 2.*|3.*) - # Tell the kernel that we are using gcc 4.6 since older kernel - # versions do not support recent gcc versions. - KCFLAGS="-U__GNUC__ -U__GNUC_MINOR__ -D__GNUC__=4 -D__GNUC_MINOR__=6" - patch -p1 <<'EOF' + *) + # See also commit f153b82121b0 ("Sanitize gcc version header + # includes") # v2.6.29. See also commit 71458cfc782e ("kernel: add + # support for gcc 5") # v3.18. See also commit cb984d101b30 + # ("compiler-gcc: integrate the various compiler-gcc[345].h + # files") # v4.2. + if kernel_version_le 2.6.29 $1 && kernel_version_lt $1 4.2; then + # Tell the kernel that we are using gcc 4.6 since older kernel + # versions do not support recent gcc versions. + patch -f -s -p1 <<'EOF' diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h index 02ae99e8e6d3..47e12c19c965 100644 --- a/include/linux/compiler-gcc.h @@ -150,6 +155,48 @@ index 02ae99e8e6d3..47e12c19c965 100644 #if !defined(__noclone) #define __noclone /* not needed */ EOF + patch -f -s -p1 <<'EOF' || +diff --git a/include/linux/compiler-gcc4.h b/include/linux/compiler-gcc4.h +index 769e19864632..2ec6c7a11502 100644 +--- a/include/linux/compiler-gcc4.h ++++ b/include/linux/compiler-gcc4.h +@@ -2,13 +2,6 @@ + #error "Please don't include directly, include instead." + #endif + +-/* 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 __must_check __attribute__((warn_unused_result)) + #define __compiler_offsetof(a,b) __builtin_offsetof(a,b) +EOF + patch -f -s -p1 <<'EOF' +diff --git a/include/linux/compiler-gcc4.h b/include/linux/compiler-gcc4.h +index 412bc6c2b023..901ca31be7f8 100644 +--- a/include/linux/compiler-gcc4.h ++++ b/include/linux/compiler-gcc4.h +@@ -2,13 +2,6 @@ + #error "Please don't include directly, include instead." + #endif + +-/* GCC 4.1.[01] miscompiles __weak */ +-#ifdef __KERNEL__ +-# if __GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL__ <= 1 +-# error Your version of gcc miscompiles the __weak directive +-# endif +-#endif +- + #define __used __attribute__((__used__)) + #define __must_check __attribute__((warn_unused_result)) + #define __compiler_offsetof(a,b) __builtin_offsetof(a,b) +EOF + fi + ;; esac if [ "$1" = "2.6.29" ] || [ "$1" = "2.6.29.1" ] || [ "$1" = "2.6.29.2" ] || @@ -362,9 +409,8 @@ index d6d65537b0d9..6aad8308a0ac 100644 EOF fi - case "$1" in - 2.6.3[6-9]*|3.[0-9]|3.[0-9].*|3.1[01345]|3.1[01345].*|3.1[789]|3.1[789].*|4.[023567]|4.[023567].*) - patch -p1 <<'EOF' + if kernel_version_le 2.6.36 $1 && kernel_version_lt $1 4.8; then + patch -f -s -p1 <<'EOF' From c6a385539175ebc603da53aafb7753d39089f32e Mon Sep 17 00:00:00 2001 From: Borislav Petkov Date: Mon, 14 Nov 2016 19:41:31 +0100 @@ -426,10 +472,11 @@ index 0ed6ce300543..c324b43712f0 100644 KBUILD_CFLAGS_MODULE := -DMODULE KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds EOF - ;; - # CentOS 6.x. - 2.6.32-*) - patch -p1 <<'EOF' + else + case "$1" in + # CentOS 6.x. + 2.6.32-*) + patch -f -s -p1 <<'EOF' --- linux-2.6.32-754.29.1.el6/Makefile.orig 2020-05-13 14:09:18.448503420 -0700 +++ linux-2.6.32-754.29.1.el6/Makefile 2020-05-13 14:11:24.265441790 -0700 @@ -355,7 +355,8 @@ @@ -452,9 +499,9 @@ EOF # Read KERNELRELEASE from include/config/kernel.release (if it exists) KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null) EOF - ;; - 2.6.3[1-5]*) - patch -p1 <<'EOF' + ;; + 2.6.3[1-5]*) + patch -f -s -p1 <<'EOF' diff --git a/Makefile b/Makefile index 141da26fda4b..343ec388ae2e 100644 --- a/Makefile @@ -477,11 +524,12 @@ index 141da26fda4b..343ec388ae2e 100644 KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null) EOF ;; - esac + esac + fi case "$1" in 4.18.0-*) # CentOS 8.x - patch -p1 <<'EOF' + patch -f -s -p1 <<'EOF' From a6e60d84989fa0e91db7f236eda40453b0e44afa Mon Sep 17 00:00:00 2001 From: Miguel Ojeda Date: Sat, 19 Jan 2019 20:59:34 +0100 @@ -560,8 +608,8 @@ index 8fa38d3e7538..f5bc4c046461 100644 EOF ;; - 2.6.32-*|3.10.0-*) # CentOS 6.x and 7.x - patch -p1 <<'EOF' + 2.*|3.*) + patch -f -s -p1 <<'EOF' --- linux-3.10.0-1127.el7/include/linux/init.h.orig 2020-05-09 20:55:48.638956513 -0700 +++ linux-3.10.0-1127.el7/include/linux/init.h 2020-05-09 20:56:46.947612445 -0700 @@ -309,13 +309,15 @@ @@ -586,6 +634,46 @@ EOF ;; esac + if kernel_version_le 3.2 $1 && kernel_version_lt $1 3.18; then + patch -f -s -p1 <<'EOF' +From eeeda4cd06e828b331b15741a204ff9f5874d28d Mon Sep 17 00:00:00 2001 +From: Ben Hutchings +Date: Wed, 24 Sep 2014 13:30:12 +0100 +Subject: [PATCH] x86/relocs: Make per_cpu_load_addr static + +per_cpu_load_addr is only used for 64-bit relocations, but is +declared in both configurations of relocs.c - with different +types. This has undefined behaviour in general. GNU ld is +documented to use the larger size in this case, but other tools +may differ and some warn about this. + +References: https://bugs.debian.org/748577 +Reported-by: Michael Tautschnig +Signed-off-by: Ben Hutchings +Cc: 748577@bugs.debian.org +Cc: Linus Torvalds +Link: http://lkml.kernel.org/r/1411561812.3659.23.camel@decadent.org.uk +Signed-off-by: Ingo Molnar +--- + arch/x86/tools/relocs.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/x86/tools/relocs.c b/arch/x86/tools/relocs.c +index bbb1d2259ecf..a5efb21d5228 100644 +--- a/arch/x86/tools/relocs.c ++++ b/arch/x86/tools/relocs.c +@@ -695,7 +695,7 @@ static void walk_relocs(int (*process)(struct section *sec, Elf_Rel *rel, + * + */ + static int per_cpu_shndx = -1; +-Elf_Addr per_cpu_load_addr; ++static Elf_Addr per_cpu_load_addr; + + static void percpu_init(void) + { +EOF + fi + # Use sed to patch the ____ilog2_NaN() prototype. sed -i 's/__attribute__((const, noreturn))/__attribute__((noreturn))/' \ include/linux/log2.h tools/include/linux/log2.h 2>/dev/null diff --git a/scripts/run-regression-tests b/scripts/run-regression-tests index ad40ace16..94a8bb483 100755 --- a/scripts/run-regression-tests +++ b/scripts/run-regression-tests @@ -677,17 +677,7 @@ do generate_kernel_patch "$k" "${generate_kernel_patch_options}" || continue ( cd "${outputdir}" && - download_and_extract_kernel_tree "$k" && - k="${k/^*}" && - cd "linux-$k/include/linux" && - if [ ! -e compiler-gcc6.h ]; then - for f in compiler-gcc5.h compiler-gcc4.h; do - if [ -e "$f" ]; then - cp "$f" compiler-gcc6.h - break - fi - done - fi + download_and_extract_kernel_tree "$k" ) || continue k="${k/^*}"