From 2d08e304a3a8b16d8062344eca3f57bd8f042cad0e7e69e5a2bd6bc20d3f4051 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Tesa=C5=99=C3=ADk?= Date: Wed, 8 Nov 2023 20:30:11 +0000 Subject: [PATCH] Accepting request 1119956 from home:olh:branches:Kernel:kdump - Fix build with old glibc with 6419b008fde783fd0cc2cc266bd1c9cf35e99a0e.patch OBS-URL: https://build.opensuse.org/request/show/1119956 OBS-URL: https://build.opensuse.org/package/show/Kernel:kdump/kexec-tools?expand=0&rev=162 --- ...b008fde783fd0cc2cc266bd1c9cf35e99a0e.patch | 112 ++++++++++++++++++ kexec-tools.changes | 5 + kexec-tools.spec | 1 + 3 files changed, 118 insertions(+) create mode 100644 6419b008fde783fd0cc2cc266bd1c9cf35e99a0e.patch diff --git a/6419b008fde783fd0cc2cc266bd1c9cf35e99a0e.patch b/6419b008fde783fd0cc2cc266bd1c9cf35e99a0e.patch new file mode 100644 index 0000000..b2f2e98 --- /dev/null +++ b/6419b008fde783fd0cc2cc266bd1c9cf35e99a0e.patch @@ -0,0 +1,112 @@ +From 6419b008fde783fd0cc2cc266bd1c9cf35e99a0e Mon Sep 17 00:00:00 2001 +From: Julien Olivain +Date: Sat, 23 Sep 2023 18:46:06 +0200 +Subject: kexec: provide a memfd_create() wrapper if not present in libc + +Commit 714fa115 "kexec/arm64: Simplify the code for zImage" introduced +a use of the memfd_create() system call, included in version +kexec-tools v2.0.27. + +This system call was introduced in kernel commit [1], first included +in kernel v3.17 (released on 2014-10-05). + +The memfd_create() glibc wrapper function was added much later in +commit [2], first included in glibc version 2.27 (released on +2018-02-01). + +This direct use memfd_create() introduced a requirement on +Kernel >= 3.17 and glibc >= 2.27. + +There is old toolchains like [3] for example (which ships gcc 7.3.1, +glibc 2.25 and includes kernel v4.10 headers), that can still be used +to build newer kernels. Even if such toolchains can be seen as +outdated, they are is still claimed as supported by recent kernel. +For example, Kernel v6.5.5 has a requirement on gcc version 5.1 and +greater. See [4]. + +Moreover, kexec-tools <= 2.0.26 could be compiled using recent +toolchains with alternative libc (e.g. uclibc-ng, musl) which are not +providing the memfd_create() wrapper. + +When compiling kexec-tools v2.0.27 with a toolchain not providing the +memfd_create() syscall wrapper, the compilation fail with message: + + kexec/kexec.c: In function 'copybuf_memfd': + kexec/kexec.c:645:7: warning: implicit declaration of function 'memfd_create'; did you mean 'SYS_memfd_create'? [-Wimplicit-function-declaration] + fd = memfd_create("kernel", MFD_ALLOW_SEALING); + ^~~~~~~~~~~~ + SYS_memfd_create + kexec/kexec.c:645:30: error: 'MFD_ALLOW_SEALING' undeclared (first use in this function); did you mean '_PC_ALLOC_SIZE_MIN'? + fd = memfd_create("kernel", MFD_ALLOW_SEALING); + ^~~~~~~~~~~~~~~~~ + _PC_ALLOC_SIZE_MIN + +In order to let kexec-tools compile in a wider range of configurations, +this commit adds a memfd_create() function check in autoconf configure +script, and adds a system call wrapper which will be used if the +function is not available. With this commit, the environment +requirement is relaxed to only kernel >= v3.17. + +Note: this issue was found in kexec-tools integration in Buildroot [5] +using the command "utils/test-pkg -a -p kexec", which tests many +toolchain/arch combinations. + +[1] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=9183df25fe7b194563db3fec6dc3202a5855839c +[2] https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=59d2cbb1fe4b8601d5cbd359c3806973eab6c62d +[3] https://releases.linaro.org/components/toolchain/binaries/7.3-2018.05/aarch64-linux-gnu/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu.tar.xz +[4] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/Documentation/process/changes.rst?h=v6.5.5#n32 +[5] https://buildroot.org/ + +Signed-off-by: Julien Olivain +Signed-off-by: Simon Horman +--- + configure.ac | 3 +++ + kexec/kexec.c | 11 +++++++++++ + 2 files changed, 14 insertions(+) + +diff --git a/configure.ac b/configure.ac +index 352eefee..602de79b 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -208,6 +208,9 @@ if test "$ac_cv_lib_xenctrl_xc_kexec_load" = yes ; then + AC_MSG_NOTICE([The kexec_status call is not available])) + fi + ++dnl Check if libc has the memfd_create() syscall wrapper ++AC_CHECK_FUNCS([memfd_create]) ++ + dnl ---Sanity checks + if test "$CC" = "no"; then AC_MSG_ERROR([cc not found]); fi + if test "$CPP" = "no"; then AC_MSG_ERROR([cpp not found]); fi +diff --git a/kexec/kexec.c b/kexec/kexec.c +index fdb4c984..08edfca2 100644 +--- a/kexec/kexec.c ++++ b/kexec/kexec.c +@@ -31,6 +31,10 @@ + #include + #include + #include ++#ifndef HAVE_MEMFD_CREATE ++#include ++#include ++#endif + #include + #include + #include +@@ -640,6 +644,13 @@ char *slurp_decompress_file(const char *filename, off_t *r_size) + return kernel_buf; + } + ++#ifndef HAVE_MEMFD_CREATE ++static int memfd_create(const char *name, unsigned int flags) ++{ ++ return syscall(SYS_memfd_create, name, flags); ++} ++#endif ++ + static int copybuf_memfd(const char *kernel_buf, size_t size) + { + int fd, count; +-- +cgit + diff --git a/kexec-tools.changes b/kexec-tools.changes index 3af673e..0884004 100644 --- a/kexec-tools.changes +++ b/kexec-tools.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Tue Oct 24 11:11:11 UTC 2023 - olaf@aepfle.de + +- Fix build with old glibc with 6419b008fde783fd0cc2cc266bd1c9cf35e99a0e.patch + ------------------------------------------------------------------- Wed Sep 6 09:10:09 UTC 2023 - Petr Tesařík diff --git a/kexec-tools.spec b/kexec-tools.spec index 0148686..09e27c7 100644 --- a/kexec-tools.spec +++ b/kexec-tools.spec @@ -29,6 +29,7 @@ Source1: https://kernel.org/pub/linux/utils/kernel/kexec/%{name}-%{versio Source2: kexec-tools.keyring Source3: kexec-load.service Source4: %{name}-rpmlintrc +Patch0: 6419b008fde783fd0cc2cc266bd1c9cf35e99a0e.patch Patch3: %{name}-disable-test.patch Patch4: %{name}-vmcoreinfo-in-xen.patch # https://patchwork.kernel.org/project/linux-riscv/patch/20190416123233.4779-1-mick@ics.forth.gr/