+ if { verlt "${kversion}" "5.11"; } && { vergte "${kversion}" "4.10"; } ; then
+ # Binutils > 2.35 strips empty symbol tables, causing obltool to fail
+ # in certain cases when files are empty.
+ # @see https://gitlab.com/linux-kernel/stable/-/commit/1d489151e9f9d1647110277ff77282fe4d96d09b
+ #
+ # There doesn't seem to be any LD/AS/AR flags to control this behaviour,
+ # therefore patching tools/objtool/elf.c is attempted.
+ patch_linux_kernel 1d489151e9f9d1647110277ff77282fe4d96d09b
+ if { verlt "${kversion}" "4.18"; } ; then
+ patch_linux_kernel e81e0724432542af8d8c702c31e9d82f57b1ff31
+ fi
+ fi
+
+ if { vergt "${selected_cc_version}" "7"; } && { vergte "${kversion}" "4.14"; } && { verlt "${kversion}" "4.17"; } ; then
+ # Builds fail due to -Werror=restrict in pager.o and str_error_r.o
+ if { verlt "${kversion}" "4.16"; } ; then
+ # This is patched since objtool's Makefile doesn't respect HOSTCFLAGS
+ # @see https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=ad343a98e74e85aa91d844310e797f96fee6983b
+ patch_linux_kernel ad343a98e74e85aa91d844310e797f96fee6983b
+ fi
+ if { verlt "${kversion}" "4.17"; } ; then
+ # This is patched since objtool's Makefile doesn't respect HOSTCFLAGS
+ # @see https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=854e55ad289ef8888e7991f0ada85d5846f5afb9
+ patch_linux_kernel 854e55ad289ef8888e7991f0ada85d5846f5afb9
+ fi
+
+ fi
+
+ if { vergt "${selected_cc_version}" "9"; } && { verlt "${kversion}" "5.6"; } ; then
+ # Duplicate decalarations of __force_order
+ # @see https://gitlab.com/linux-kernel/stable/-/commit/df6d4f9db79c1a5d6f48b59db35ccd1e9ff9adfc
+ # However, kaslr_64.c doesn't exit in 4.15, 4.16, it's named pagetable.c
+ if [ -f arch/x86/boot/compressed/pagetable.c ] ; then
+ sed -i '/^unsigned long __force_order;$/d' arch/x86/boot/compressed/pagetable.c
+ fi
+ if [ -f arch/x86/boot/compressed/kaslr_64.c ] ; then
+ patch_linux_kernel df6d4f9db79c1a5d6f48b59db35ccd1e9ff9adfc
+ fi
+ fi
+
+ if { vergte "${kversion}" "4.18"; } && { verlt "${kversion}" "4.19"; } ; then
+ # In some cases, compiling net/bpfilter can fail with the following error:
+ # net/bpfilter/main.c:9:10: fatal error: include/uapi/linux/bpf.h: No such file or directory
+ # make[2]: *** [scripts/Makefile.host:107: net/bpfilter/main.o] Error 1
+ #
+ # While the issue is potentially in a number of old versions, it has only
+ # been observed in v4.18-rt
+ #
+ patch_linux_kernel 303a339f30a9441c4695d3d2cc78f1b33cd959ff
+ fi
+
+ if { vergte "${kversion}" "4.18"; } && { verlt "${kversion}" "4.19"; } ; then
+ # In some cases, compiling net/bpfilter can fail with the following error:
+ # net/bpfilter/main.c:9:10: fatal error: include/uapi/linux/bpf.h: No such file or directory
+ # make[2]: *** [scripts/Makefile.host:107: net/bpfilter/main.o] Error 1
+ #
+ # While the issue is potentially in a number of old versions, it has only
+ # been observed in v4.18-rt
+ #
+ patch_linux_kernel 303a339f30a9441c4695d3d2cc78f1b33cd959ff
+ fi
+
+ if { vergte "${kversion}" "4.15"; } && { verlt "${kversion}" "4.18"; } ; then
+ # Some old kernels fail to build when make is too new
+ # @see https://gitlab.com/linux-kernel/stable/-/commit/9feeb638cde083c737e295c0547f1b4f28e99583
+ patch_linux_kernel 9564a8cf422d7b58f6e857e3546d346fa970191e
+ fi
+
+ if { vergte "${kversion}" "4.14"; } && { verlt "${kversion}" "4.14.55"; } ; then
+ # Some old kernels fail to build when make is too new
+ # @see https://gitlab.com/linux-kernel/stable/-/commit/9feeb638cde083c737e295c0547f1b4f28e99583
+ patch_linux_kernel e82885490a611f2b75a6c27cd7bb09665c1740be
+ fi
+
+ if ( { vergte "${kversion}" "4.15"; } && { verlt "${kversion}" "4.18"; } ) || \
+ ( { vergte "${kversion}" "4.14"; } && { verlt "${kversion}" "4.14.56"; } ) ; then
+ # Some old kernels fail to build when make is too new
+ # @see https://gitlab.com/linux-kernel/stable/-/commit/9feeb638cde083c737e295c0547f1b4f28e99583
+ patch_linux_kernel 9feeb638cde083c737e295c0547f1b4f28e99583
+ fi
+
+ if ( { vergte "${kversion}" "4.12"; } && { verlt "${kversion}" "4.20.17"; } ) || \
+ ( { vergte "${kversion}" "5.0"; } && { verlt "${kversion}" "5.0.12"; } ) ; then
+ # Old kernels can fail to build while on newer host kernels with errors
+ # such as:
+ # In file included from scripts/selinux/genheaders/genheaders.c:19:
+ # ./security/selinux/include/classmap.h:249:2: error: #error New address family defined, please update secclass_map.
+ # @see https://gitlab.com/linux-kernel/stable/-/commit/dfbd199a7cfe3e3cd8531e1353cdbd7175bfbc5e
+ #
+ patch_linux_kernel dfbd199a7cfe3e3cd8531e1353cdbd7175bfbc5e
+ fi
+
+ # Compatibility with binutils >= ~ 2.31
+ if { vergte "${kversion}" "3.19"; } && { verlt "${kversion}" "4.16"; } ; then
+ patch_linux_kernel b21ebf2fb4cde1618915a97cc773e287ff49173e
+ fi
+ if { vergte "${kversion}" "3.17"; } && { verlt "${kversion}" "3.18.69"; } ; then
+ patch_linux_kernel edb9d2d5e647e7a8521b0d35f8452deb02dfd138
+ fi
+ if { vergte "${kversion}" "3.17"; } && { verlt "${kversion}" "3.18.100"; } ; then
+ patch_linux_kernel 3be6583f0b6f1bf1ee650ebf473d9dee36836527
+ patch_linux_kernel 12d839211d080f6a9c370398c41a260365d34c62
+ fi
+ if { vergte "${kversion}" "3.16"; } && { verlt "${kversion}" "3.16.82"; } ; then
+ patch_linux_kernel ad10e6d464796f2a481de4039a43b9cfca034e1c
+ fi
+
+ if ( { vergte "${kversion}" "3.14"; } && { verlt "${kversion}" "4.4"; } ) ||
+ ( { vergte "${kversion}" "4.8"; } && { verlt "${kversion}" "4.18"; } ); then
+ # While the original motivation of this patch is for fixing builds using
+ # clang, the same error occurs between linux >= 3.14 and < 4.4, and in
+ # 4.15, 4.16.
+ # For rt-linux, the error has been observed in 4.8, 4.11, and 4.13.
+ #
+ # This patch only partially applies due to changes in kernel/Makefile,
+ # so a supplementary patch is needed
+ #
+ # Without this patch, builds fail with
+ # Cannot find symbol for section 2: .text.
+ # kernel/elfcore.o: failed
+ #
+ # @see https://github.com/linuxppc/issues/issues/388
+ # @see https://lore.kernel.org/lkml/20201204165742.3815221-2-arnd@kernel.org/
+ #
+ patch_linux_kernel 6e7b64b9dd6d96537d816ea07ec26b7dedd397b9
+ if grep -q elfcore.o kernel/Makefile ; then
+ sed -i '/^.* += elfcore.o$/d' kernel/Makefile
+ fi
+ fi
+ # Same as above for the v4.4 branch
+ if ( { vergte "${kversion}" "4.4"; } && { verlt "${kversion}" "4.4.257"; } ); then
+ patch_linux_kernel 3140b0740b31cc63cf2ee08bc3f746b423eb068d
+ if grep -q elfcore.o kernel/Makefile ; then
+ sed -i '/^.* += elfcore.o$/d' kernel/Makefile
+ fi
+ fi
+
+ if { vergte "${kversion}" "4.5"; } && { verlt "${kversion}" "4.8"; } ; then
+ # Kernels between v4.5 and v4.8 built with gcc >= 8 on arm will hit an
+ # assembler error :
+ #
+ # kernel/.tmp_fork.s: Assembler messages:
+ # kernel/.tmp_fork.s:1790: Error: .err encountered
+ #
+ # @see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85745
+ #
+ patch_linux_kernel 9f73bd8bb445e0cbe4bcef6d4cfc788f1e184007
+ fi
+
+ if ( { vergte "${kversion}" "4.4"; } && { verlt "${kversion}" "4.4.136"; } ) ||
+ ( { vergte "${kversion}" "4.5"; } && { verlt "${kversion}" "4.8"; } ); then
+ # Hacky patch to deal with the following build error:
+ # Cannot find symbol for section 7: .text.unlikely.
+ # kernel/kexec_file.o: failed
+ # make[1]: *** [scripts/Makefile.build:291: kernel/kexec_file.o] Error 1
+ #
+ # This error happens with binutils 2.36 and 2.37, but should probably not
+ # be an issue with binutils 2.38.
+ # @see https://github.com/linuxppc/issues/issues/388
+ # @see https://github.com/bminor/binutils-gdb/commit/c09c8b42021180eee9495bd50d8b35e683d3901b
+ #
+ # There is some sort of config (unspecified in past discussions) which
+ # provokes the error, and there was never a potential fix merged in
+ # this discussion, in part because the build systems of the kernel
+ # switched to objtool instead.
+ #
+ # @see https://lore.kernel.org/all/20210215162209.5e2a475b@gandalf.local.home/
+ #
+ sed -i 's/return txtname;/return shdr0->sh_size ? txtname : NULL;/' scripts/recordmcount.h
+
+ # After applying the above patch, the build continues but fails with
+ # head64.c:(.text.exit+0x5): undefined reference to `__gcov_exit'
+ #
+ scripts/config --disable CONFIG_GCOV_KERNEL
+ fi
+
+ if { vergte "${kversion}" "4.5"; } && { verlt "${kversion}" "4.5.5"; } ; then
+ # drivers/staging/wilc1000/wilc_spi.c:123:34: error: storage size of ‘wilc1000_spi_ops’ isn’t known
+ patch_linux_kernel ce7b516f3f9e11fe4ee06fad0d7e853bb6e8f160
+ fi
+