#!/bin/bash # Shell functions for parsing the Linux kernel version and for downloading # from kernel.org. # shellcheck source=./rhel-rpm-functions source "$(dirname "$0")/../scripts/rhel-rpm-functions" || return $? kernel_mirror="http://cdn.kernel.org/pub/linux/kernel" kernel_downloads="$HOME/software/downloads" kernel_tree="$HOME/software/linux-kernel" # Whether or not kernel version $1 is lower than or equal kernel version $2. function kernel_version_le { awk -v "v1=$1" -v "v2=$2" 'BEGIN { n1 = split(v1, v1a, "."); n2 = split(v2, v2a, "."); for (i=1;;i++) { e1 = i <= n1 ? v1a[i] : 0; e2 = i <= n2 ? v2a[i] : 0; if (e1 < e2 || i > n1 && i > n2) exit 0; if (e1 > e2) exit 1; }}' } function kernel_version_lt { [ "$1" != "$2" ] && kernel_version_le "$1" "$2" } # Kernel version number. function kernel_version { if [ "${1#2.}" != "$1" ]; then echo "$1" | sed -n 's/^\([0-9]*\.[0-9]*\.[0-9]*\).*$/\1/p' else echo "$1" | sed -n 's/^\([0-9]*\.[0-9]*\).*$/\1/p' fi } # Last component of the kernel version, or the empty string if $1 does # not contain a patchlevel. function patchlevel { if [ "${1#2.}" != "$1" ]; then echo "$1" | sed -n 's/^\([0-9]*\.[0-9]*\.[0-9]*\)[.-]\(.*\)$/\2/p' else echo "$1" | sed -n 's/^\([0-9]*\.[0-9]*\)[.-]\(.*\)$/\2/p' fi } # Download the file from URL $1 and save it in the current directory. function download_file { if [ ! -e "$(basename "$1")" ]; then if [ "${quiet_download}" = "false" ]; then { wget -q -nc -O- "$1" 2>/dev/null | grep -q .; } \ && echo "Downloading $1 ..." fi wget -q -nc "$1" fi [ -e "$(basename "$1")" ] } # Make sure the kernel tarball and patch file are present in directory # ${kernel_downloads}. Download any missing files from ${kernel_mirror}. function download_kernel { local kver="$(kernel_version "$1")" local plevel="$(patchlevel "$1")" local series="$1" case "${series:0:2}" in [12].*) series="${series:0:3}";; *) series="${series/.*/}.x";; esac mkdir -p "${kernel_downloads}" || return $? test -w "${kernel_downloads}" || return $? ( cd "${kernel_downloads}" || return $? if [ "$plevel" = "" ] || [ "$plevel" = "0" ] || download_file "${kernel_mirror}/v$series/patch-$1.xz" then download_file "${kernel_mirror}/v$series/linux-${kver}.tar.xz" || return $? else download_file "${kernel_mirror}/v$series/linux-$1.tar.xz" || return $? fi ) } function extract_kernel_archive { local kver="$(kernel_version "$1")" local plevel="$(patchlevel "$1")" local series="$1" if [ -e "${kernel_downloads}/linux-$1.tar.xz" ]; then xz -cd "${kernel_downloads}/linux-$1.tar.xz" | tar xf - elif [ -e "${kernel_downloads}/linux-$kver.tar.xz" ]; then xz -cd "${kernel_downloads}/linux-$kver.tar.xz" | tar xf - && mv "linux-$kver" "linux-$1" elif [ -e "${kernel_downloads}/linux-$1.tar.bz2" ]; then tar xjf "${kernel_downloads}/linux-$1.tar.bz2" elif [ -e "${kernel_downloads}/linux-$kver.tar.bz2" ]; then tar xjf "${kernel_downloads}/linux-$kver.tar.bz2" && mv "linux-$kver" "linux-$1" else return 1 fi } # Create a linux-$1 tree in the current directory, where $1 is a kernel # version number with either three or four components. function extract_kernel_tree { local kver="$(kernel_version "$1")" local plevel="$(patchlevel "$1")" local tmpdir=kernel-tree-tmp-$$ rm -rf "linux-$1" "${tmpdir}" mkdir "${tmpdir}" || return $? ( cd "${tmpdir}" || return $? if [ "$plevel" != "" ] && [ "$plevel" != "0" ] && [ -e "${kernel_downloads}/patch-$1.xz" ]; then extract_kernel_archive "$kver" || return $? mv "linux-$kver" "linux-$1" ( cd "linux-$1" && xz -cd "${kernel_downloads}/patch-$1.xz" \ | patch -p1 -f -s; ) \ || return $? else extract_kernel_archive "$1" || { extract_kernel_archive "$kver" && mv "linux-$kver" "linux-$1"; } || return $? fi mv "linux-$1" ".." || return $? cd "../linux-$1" || return $? ) rmdir "${tmpdir}" } # Patch a kernel tree where $1 is the kernel version. function patch_kernel { case "$1" in *^*) # RHEL / CentOS or UEK. ;; *) # 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. See also commit # 9c695203a7dd ("compiler-gcc.h: gcc-4.5 needs noclone and # noinline on __naked functions") # v2.6.35. if kernel_version_le 2.6.35 "$1"; then 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 +++ b/include/linux/compiler-gcc.h @@ -103,7 +103,7 @@ #define __gcc_header(x) #x #define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h) #define gcc_header(x) _gcc_header(x) -#include gcc_header(__GNUC__) +#include "linux/compiler-gcc4.h" #if !defined(__noclone) #define __noclone /* not needed */ EOF else patch -f -s -p1 <<'EOF' diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h index a3ed7cb8ca34..c5a6b8b52db4 100644 --- a/include/linux/compiler-gcc.h +++ b/include/linux/compiler-gcc.h @@ -83,4 +83,4 @@ #define __gcc_header(x) #x #define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h) #define gcc_header(x) _gcc_header(x) -#include gcc_header(__GNUC__) +#include "linux/compiler-gcc4.h" EOF fi # See also commit 733ed6e43756 ("compiler-gcc{3,4}.h: Use # GCC_VERSION macro") # v3.9. if kernel_version_le 3.9 "$1"; then 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 else 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 fi ;; esac if [ "${1#2.6.31}" != "$1" ]; then patch -f -s -p1 <<'EOF' Checking a 2.6.31.1 kernel configured with allyesconfig/allmodconfig with sparse (make C=2) triggers a sparse warning on code that uses the kmemcheck_annotate_bitfield() macro. An example of such a warning: include/net/inet_sock.h:208:17: warning: do-while statement is not a compound statement Signed-off-by: Bart Van Assche Cc: Vegard Nossum Cc: Andrew Morton --- See also http://lkml.org/lkml/2009/9/26/51 --- linux-2.6.31.1/include/linux/kmemcheck-orig.h 2009-09-26 13:53:44.000000000 +0200 +++ linux-2.6.31.1/include/linux/kmemcheck.h 2009-09-26 13:53:56.000000000 +0200 @@ -137,13 +137,13 @@ static inline void kmemcheck_mark_initia int name##_end[0]; #define kmemcheck_annotate_bitfield(ptr, name) \ - do if (ptr) { \ + do { if (ptr) { \ int _n = (long) &((ptr)->name##_end) \ - (long) &((ptr)->name##_begin); \ BUILD_BUG_ON(_n < 0); \ \ kmemcheck_mark_initialized(&((ptr)->name##_begin), _n); \ - } while (0) + } } while (0) #define kmemcheck_annotate_variable(var) \ do { \ EOF fi if [ "${1#2.6.32}" != "$1" ] || [ "${1#2.6.33}" != "$1" ] then patch -f -s -p1 <<'EOF' Get rid of sparse errors on sk_buff.protocol. --- linux/include/linux/skbuff-orig.h 2010-12-07 13:40:51.000000000 -0500 +++ linux/include/linux/skbuff.h 2010-12-07 13:41:05.000000000 -0500 @@ -349,8 +349,8 @@ struct sk_buff { ipvs_property:1, peeked:1, nf_trace:1; - __be16 protocol:16; kmemcheck_bitfield_end(flags1); + __be16 protocol; void (*destructor)(struct sk_buff *skb); #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) EOF fi if [ "${1#3.13}" != "$1" ]; then if [ "$1" = "3.13" ] || [ "${1#3.13.}" -lt 6 ]; then patch -f -s -p1 <<'EOF' From 7b4ec8dd7d4ac467e9eee4d49f2c9574d773efbb Mon Sep 17 00:00:00 2001 From: Johannes Berg Date: Thu, 16 Jan 2014 10:18:48 +1030 Subject: [PATCH] export: declare ksymtab symbols sparse complains about any __ksymtab symbols with the following: warning: symbol '__ksymtab_...' was not declared. Should it be static? due to Andi's patch making it non-static. Mollify sparse by declaring the symbol extern, otherwise we get drowned in sparse warnings for anything that uses EXPORT_SYMBOL in the sources, making it easy to miss real warnings. Fixes: e0f244c63fc9 ("asmlinkage, module: Make ksymtab [...] __visible") Signed-off-by: Johannes Berg Acked-by: Andi Kleen Signed-off-by: Rusty Russell --- include/linux/export.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/linux/export.h b/include/linux/export.h index 3f2793d..96e45ea 100644 --- a/include/linux/export.h +++ b/include/linux/export.h @@ -59,6 +59,7 @@ extern struct module __this_module; static const char __kstrtab_##sym[] \ __attribute__((section("__ksymtab_strings"), aligned(1))) \ = VMLINUX_SYMBOL_STR(sym); \ + extern const struct kernel_symbol __ksymtab_##sym; \ __visible const struct kernel_symbol __ksymtab_##sym \ __used \ __attribute__((section("___ksymtab" sec "+" #sym), unused)) \ EOF fi fi if [ "${1#4.15}" != "$1" ]; then patch -f -s -p1 <<'EOF' From ad343a98e74e85aa91d844310e797f96fee6983b Mon Sep 17 00:00:00 2001 From: Sergey Senozhatsky Date: Tue, 6 Feb 2018 15:37:52 -0800 Subject: [PATCH] tools/lib/subcmd/pager.c: do not alias select() params Use a separate fd set for select()-s exception fds param to fix the following gcc warning: pager.c:36:12: error: passing argument 2 to restrict-qualified parameter aliases with argument 4 [-Werror=restrict] select(1, &in, NULL, &in, NULL); ^~~ ~~~ Link: http://lkml.kernel.org/r/20180101105626.7168-1-sergey.senozhatsky@gmail.com Signed-off-by: Sergey Senozhatsky Cc: Arnaldo Carvalho de Melo Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- tools/lib/subcmd/pager.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/lib/subcmd/pager.c b/tools/lib/subcmd/pager.c index 5ba754d17952..9997a8805a82 100644 --- a/tools/lib/subcmd/pager.c +++ b/tools/lib/subcmd/pager.c @@ -30,10 +30,13 @@ static void pager_preexec(void) * have real input */ fd_set in; + fd_set exception; FD_ZERO(&in); + FD_ZERO(&exception); FD_SET(0, &in); - select(1, &in, NULL, &in, NULL); + FD_SET(0, &exception); + select(1, &in, NULL, &exception, NULL); setenv("LESS", "FRSX", 0); } EOF patch -f -s -p1 <<'EOF' From 854e55ad289ef8888e7991f0ada85d5846f5afb9 Mon Sep 17 00:00:00 2001 From: Josh Poimboeuf Date: Thu, 15 Mar 2018 22:11:54 -0500 Subject: [PATCH] objtool, perf: Fix GCC 8 -Wrestrict error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Starting with recent GCC 8 builds, objtool and perf fail to build with the following error: ../str_error_r.c: In function 'str_error_r': ../str_error_r.c:25:3: error: passing argument 1 to restrict-qualified parameter aliases with argument 5 [-Werror=restrict] snprintf(buf, buflen, "INTERNAL ERROR: strerror_r(%d, %p, %zd)=%d", errnum, buf, buflen, err); The code seems harmless, but there's probably no benefit in printing the 'buf' pointer in this situation anyway, so just remove it to make GCC happy. Reported-by: Laura Abbott Signed-off-by: Josh Poimboeuf Tested-by: Laura Abbott Cc: Adrian Hunter Cc: Jiri Olsa Cc: Namhyung Kim Cc: Wang Nan Link: http://lkml.kernel.org/r/20180316031154.juk2uncs7baffctp@treble Signed-off-by: Arnaldo Carvalho de Melo --- tools/lib/str_error_r.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/lib/str_error_r.c b/tools/lib/str_error_r.c index d6d65537b0d9..6aad8308a0ac 100644 --- a/tools/lib/str_error_r.c +++ b/tools/lib/str_error_r.c @@ -22,6 +22,6 @@ char *str_error_r(int errnum, char *buf, size_t buflen) { int err = strerror_r(errnum, buf, buflen); if (err) - snprintf(buf, buflen, "INTERNAL ERROR: strerror_r(%d, %p, %zd)=%d", errnum, buf, buflen, err); + snprintf(buf, buflen, "INTERNAL ERROR: strerror_r(%d, [buf], %zd)=%d", errnum, buflen, err); return buf; } EOF fi 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 Subject: [PATCH] kbuild: Steal gcc's pie from the very beginning So Sebastian turned off the PIE for kernel builds but that was too late - Kbuild.include already uses KBUILD_CFLAGS and trying to disable gcc options with, say cc-disable-warning, fails: gcc -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs ... -Wno-sign-compare -fno-asynchronous-unwind-tables -Wframe-address -c -x c /dev/null -o .31392.tmp /dev/null:1:0: error: code model kernel does not support PIC mode because that returns an error and we can't disable the warning. For example in this case: KBUILD_CFLAGS += $(call cc-disable-warning,frame-address,) which leads to gcc issuing all those warnings again. So let's turn off PIE/PIC at the earliest possible moment, when we declare KBUILD_CFLAGS so that cc-disable-warning picks it up too. Also, we need the $(call cc-option ...) because -fno-PIE is supported since gcc v3.4 and our lowest supported gcc version is 3.2 right now. Signed-off-by: Borislav Petkov Cc: stable@vger.kernel.org Cc: Ben Hutchings Cc: Sebastian Andrzej Siewior Signed-off-by: Michal Marek [ bvanassche: moved -fno-PIE to start of KBUILD_CFLAGS ] --- Makefile | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 0ed6ce300543..c324b43712f0 100644 --- a/Makefile +++ b/Makefile @@ -378,7 +378,8 @@ LINUXINCLUDE := \ KBUILD_CPPFLAGS := -D__KERNEL__ -KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ +KBUILD_CFLAGS := $(call cc-option,-fno-PIE) \ + -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ -fno-strict-aliasing -fno-common \ -Werror-implicit-function-declaration \ -Wno-format-security \ @@ -387,7 +388,7 @@ KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ KBUILD_AFLAGS_KERNEL := KBUILD_CFLAGS_KERNEL := -KBUILD_AFLAGS := -D__ASSEMBLY__ +KBUILD_AFLAGS := -D__ASSEMBLY__ $(call cc-option,-fno-PIE) KBUILD_AFLAGS_MODULE := -DMODULE KBUILD_CFLAGS_MODULE := -DMODULE KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds 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 @@ KBUILD_CPPFLAGS := -D__KERNEL__ -KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ +KBUILD_CFLAGS := $(call cc-option,-fno-PIE) \ + -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ -fno-strict-aliasing -fno-common \ -Werror-implicit-function-declaration \ -Wno-format-security \ @@ -380,7 +381,7 @@ endif ##($(KBUILD_EXTMOD),) endif #(,$(filter $(ARCH), i386 x86_64)) -KBUILD_AFLAGS := -D__ASSEMBLY__ +KBUILD_AFLAGS := -D__ASSEMBLY__ $(call cc-option,-fno-PIE) # 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 -f -s -p1 <<'EOF' diff --git a/Makefile b/Makefile index 141da26fda4b..343ec388ae2e 100644 --- a/Makefile +++ b/Makefile @@ -349,12 +349,13 @@ LINUXINCLUDE := -I$(srctree)/arch/$(hdr-arch)/include -Iinclude \ KBUILD_CPPFLAGS := -D__KERNEL__ -KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ +KBUILD_CFLAGS := $(call cc-option,-fno-PIE) \ + -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ -fno-strict-aliasing -fno-common \ -Werror-implicit-function-declaration \ -Wno-format-security \ -fno-delete-null-pointer-checks -KBUILD_AFLAGS := -D__ASSEMBLY__ +KBUILD_AFLAGS := -D__ASSEMBLY__ $(call cc-option,-fno-PIE) # Read KERNELRELEASE from include/config/kernel.release (if it exists) KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null) EOF ;; esac fi case "$1" in 4.18.0-*) # CentOS 8.x 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 Subject: [PATCH] include/linux/module.h: copy __init/__exit attrs to init/cleanup_module The upcoming GCC 9 release extends the -Wmissing-attributes warnings (enabled by -Wall) to C and aliases: it warns when particular function attributes are missing in the aliases but not in their target. In particular, it triggers for all the init/cleanup_module aliases in the kernel (defined by the module_init/exit macros), ending up being very noisy. These aliases point to the __init/__exit functions of a module, which are defined as __cold (among other attributes). However, the aliases themselves do not have the __cold attribute. Since the compiler behaves differently when compiling a __cold function as well as when compiling paths leading to calls to __cold functions, the warning is trying to point out the possibly-forgotten attribute in the alias. In order to keep the warning enabled, we decided to silence this case. Ideally, we would mark the aliases directly as __init/__exit. However, there are currently around 132 modules in the kernel which are missing __init/__exit in their init/cleanup functions (either because they are missing, or for other reasons, e.g. the functions being called from somewhere else); and a section mismatch is a hard error. A conservative alternative was to mark the aliases as __cold only. However, since we would like to eventually enforce __init/__exit to be always marked, we chose to use the new __copy function attribute (introduced by GCC 9 as well to deal with this). With it, we copy the attributes used by the target functions into the aliases. This way, functions that were not marked as __init/__exit won't have their aliases marked either, and therefore there won't be a section mismatch. Note that the warning would go away marking either the extern declaration, the definition, or both. However, we only mark the definition of the alias, since we do not want callers (which only see the declaration) to be compiled as if the function was __cold (and therefore the paths leading to those calls would be assumed to be unlikely). Link: https://lore.kernel.org/lkml/20190123173707.GA16603@gmail.com/ Link: https://lore.kernel.org/lkml/20190206175627.GA20399@gmail.com/ Suggested-by: Martin Sebor Acked-by: Jessica Yu Signed-off-by: Miguel Ojeda --- include/linux/module.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/linux/module.h b/include/linux/module.h index 8fa38d3e7538..f5bc4c046461 100644 --- a/include/linux/module.h +++ b/include/linux/module.h @@ -129,13 +129,13 @@ extern void cleanup_module(void); #define module_init(initfn) \ static inline initcall_t __maybe_unused __inittest(void) \ { return initfn; } \ - int init_module(void) __attribute__((alias(#initfn))); + int init_module(void) __attribute__((__copy__(initfn))) __attribute__((alias(#initfn))); /* This is only required if you want to be unloadable. */ #define module_exit(exitfn) \ static inline exitcall_t __maybe_unused __exittest(void) \ { return exitfn; } \ - void cleanup_module(void) __attribute__((alias(#exitfn))); + void cleanup_module(void) __attribute__((__copy__(exitfn))) __attribute__((alias(#exitfn))); #endif 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 @@ #define module_init(initfn) \ static inline initcall_t __inittest(void) \ { return initfn; } \ - int init_module(void) __attribute__((alias(#initfn))); + int init_module(void) __attribute__((__copy__(initfn))) \ + __attribute__((alias(#initfn))); /* This is only required if you want to be unloadable. */ #define module_exit(exitfn) \ static inline exitcall_t __exittest(void) \ { return exitfn; } \ - void cleanup_module(void) __attribute__((alias(#exitfn))); + void cleanup_module(void) __attribute__((__copy__(exitfn)))\ + __attribute__((alias(#exitfn))); #define __setup_param(str, unique_id, fn) /* nothing */ #define __setup(str, func) /* nothing */ 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 # See also commit e33a814e772c ("scripts/dtc: Remove redundant YYLOC global # declaration") # v5.6~10^2. if kernel_version_le 2.6.38 "$1" && kernel_version_lt "$1" 5.6; then patch -p1 -f -s <<'EOF' From e33a814e772cdc36436c8c188d8c42d019fda639 Mon Sep 17 00:00:00 2001 From: Dirk Mueller Date: Tue, 14 Jan 2020 18:53:41 +0100 Subject: [PATCH] scripts/dtc: Remove redundant YYLOC global declaration gcc 10 will default to -fno-common, which causes this error at link time: (.text+0x0): multiple definition of `yylloc'; dtc-lexer.lex.o (symbol from plugin):(.text+0x0): first defined here This is because both dtc-lexer as well as dtc-parser define the same global symbol yyloc. Before with -fcommon those were merged into one defintion. The proper solution would be to to mark this as "extern", however that leads to: dtc-lexer.l:26:16: error: redundant redeclaration of 'yylloc' [-Werror=redundant-decls] 26 | extern YYLTYPE yylloc; | ^~~~~~ In file included from dtc-lexer.l:24: dtc-parser.tab.h:127:16: note: previous declaration of 'yylloc' was here 127 | extern YYLTYPE yylloc; | ^~~~~~ cc1: all warnings being treated as errors which means the declaration is completely redundant and can just be dropped. Signed-off-by: Dirk Mueller Signed-off-by: David Gibson [robh: cherry-pick from upstream] Cc: stable@vger.kernel.org Signed-off-by: Rob Herring --- scripts/dtc/dtc-lexer.l | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/dtc/dtc-lexer.l b/scripts/dtc/dtc-lexer.l index 5c6c3fd557d7..b3b7270300de 100644 --- a/scripts/dtc/dtc-lexer.l +++ b/scripts/dtc/dtc-lexer.l @@ -23,7 +23,6 @@ LINECOMMENT "//".*\n #include "srcpos.h" #include "dtc-parser.tab.h" -YYLTYPE yylloc; extern bool treesource_error; /* CAUTION: this will stop working if we ever use yyless() or yyunput() */ 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 # After patch-v4.14.1[12] has been applied, the execute bit has to be # set for sync-check.sh since patch can't do that. for f in "tools/objtool/sync-check.sh"; do if [ -e "$f" ]; then chmod a+x "$f" fi done } function download_and_extract_distro_rpm { [ -n "$1" ] || return $? set -- ${1//^/ } local kver=$1 local distro=$2 local release=$3 ( cd "${kernel_downloads}" || exit $? read -a urls -r <<<"$(get_srpm_urls "$distro" "$release" x86_64 | tr '\n' ' ')" for url in "${urls[@]}"; do case "$distro" in CentOS) wget -q -nc "${url}/kernel-${kver}.src.rpm" && break ;; UEK) wget -q -nc "${url}/kernel-uek-${kver}.src.rpm" && break ;; esac done ) local tmpdir=kernel-tree-tmp-$$ rm -rf "linux-$1" "${tmpdir}" mkdir "${tmpdir}" || return $? ( cd "${tmpdir}" && case "$distro" in CentOS) rpm2cpio "${kernel_downloads}/kernel-${kver}.src.rpm" | cpio -i --make-directories --quiet && tar xaf "linux-${kver}.tar."* && mv "linux-${kver}" ".." && cd "../linux-${kver}" ;; UEK) rpm2cpio "${kernel_downloads}/kernel-uek-${kver}.src.rpm" | cpio -i --make-directories --quiet && tar xaf "linux-${kver/-*}.tar."* && mv "linux-${kver/-*}" "../linux-${kver}" && cd "../linux-${kver}" ;; *) echo "Error: unknown distro $distro" ;; esac ) || return $? rm -rf "${tmpdir}" } function download_and_extract_kernel_tree { if [ "${1/^}" = "$1" ]; then # Upstream kernel. if [ -e "${kernel_tree}" ]; then # If a git kernel tree is available, obtain the kernel source code # from that git tree. ( cd "${kernel_tree}" && { { git tag -l "v$1" | grep -q '^v'; } || { echo "Could not find tag v$1;" \ "updating git repository" 1>&2 git fetch origin git fetch stable } } && { git tag -l "v$1" | grep -q '^v'; } && git archive "v$1" ) | { rm -rf "linux-$1" && mkdir "linux-$1" && tar -C "linux-$1" -xf- 2>/dev/null } else # Otherwise download a source code tar file and extract it. download_kernel "$1" && extract_kernel_tree "$1" fi else # Distro kernel. download_and_extract_distro_rpm "$1" fi && (cd "linux-${1/^*}" && patch_kernel "${1/^*}") } # For shellcheck if false; then quiet_download=true fi