diff -Nru kexec-tools-2.0.22/debian/changelog kexec-tools-2.0.22/debian/changelog --- kexec-tools-2.0.22/debian/changelog 2023-07-03 12:34:26.000000000 +0000 +++ kexec-tools-2.0.22/debian/changelog 2023-08-09 13:12:40.000000000 +0000 @@ -1,3 +1,10 @@ +kexec-tools (1:2.0.22-2ubuntu2.22.04.2) jammy; urgency=medium + + * Add d/p/lp2030476-s390-handle-R_390_PLT32DBL-reloc-entries-in-machine.patch + to fix kdump kernel load failure on s390x. (LP: #2030476) + + -- Frank Heimes Wed, 09 Aug 2023 15:12:40 +0200 + kexec-tools (1:2.0.22-2ubuntu2.22.04.1) jammy; urgency=medium * Support more than one crash kernel regions for arm64 (LP: #2024479) diff -Nru kexec-tools-2.0.22/debian/patches/lp2030476-s390-handle-R_390_PLT32DBL-reloc-entries-in-machine.patch kexec-tools-2.0.22/debian/patches/lp2030476-s390-handle-R_390_PLT32DBL-reloc-entries-in-machine.patch --- kexec-tools-2.0.22/debian/patches/lp2030476-s390-handle-R_390_PLT32DBL-reloc-entries-in-machine.patch 1970-01-01 00:00:00.000000000 +0000 +++ kexec-tools-2.0.22/debian/patches/lp2030476-s390-handle-R_390_PLT32DBL-reloc-entries-in-machine.patch 2023-08-09 13:12:40.000000000 +0000 @@ -0,0 +1,106 @@ +From 186e7b0752d8fce1618fa37519671c834c46340e Mon Sep 17 00:00:00 2001 +From: Alexander Egorenkov +Date: Wed, 15 Dec 2021 18:48:53 +0100 +Subject: [PATCH] s390: handle R_390_PLT32DBL reloc entries in + machine_apply_elf_rel() + +Starting with gcc 11.3, the C compiler will generate PLT-relative function +calls even if they are local and do not require it. Later on during linking, +the linker will replace all PLT-relative calls to local functions with +PC-relative ones. Unfortunately, the purgatory code of kexec/kdump is +not being linked as a regular executable or shared library would have been, +and therefore, all PLT-relative addresses remain in the generated purgatory +object code unresolved. This in turn lets kexec-tools fail with +"Unknown rela relocation: 0x14 0x73c0901c" for such relocation types. + +Furthermore, the clang C compiler has always behaved like described above +and this commit should fix the purgatory code built with the latter. + +Because the purgatory code is no regular executable or shared library, +contains only calls to local functions and has no PLT, all R_390_PLT32DBL +relocation entries can be resolved just like a R_390_PC32DBL one. + +* https://refspecs.linuxfoundation.org/ELF/zSeries/lzsabi0_zSeries/x1633.html#AEN1699 + +Relocation entries of purgatory code generated with gcc 11.3 +------------------------------------------------------------ + +$ readelf -r purgatory/purgatory.o + +Relocation section '.rela.text' at offset 0x6e8 contains 27 entries: + Offset Info Type Sym. Value Sym. Name + Addend +00000000000c 000300000013 R_390_PC32DBL 0000000000000000 .data + 2 +00000000001a 001000000014 R_390_PLT32DBL 0000000000000000 sha256_starts + 2 +000000000030 001100000014 R_390_PLT32DBL 0000000000000000 sha256_update + 2 +000000000046 001200000014 R_390_PLT32DBL 0000000000000000 sha256_finish + 2 +000000000050 000300000013 R_390_PC32DBL 0000000000000000 .data + 102 +00000000005a 001300000014 R_390_PLT32DBL 0000000000000000 memcmp + 2 +... +000000000118 001600000014 R_390_PLT32DBL 0000000000000000 setup_arch + 2 +00000000011e 000300000013 R_390_PC32DBL 0000000000000000 .data + 2 +00000000012c 000f00000014 R_390_PLT32DBL 0000000000000000 verify_sha256_digest + 2 +000000000142 001700000014 R_390_PLT32DBL 0000000000000000 +post_verification[...] + 2 + +Relocation entries of purgatory code generated with gcc 11.2 +------------------------------------------------------------ + +$ readelf -r purgatory/purgatory.o + +Relocation section '.rela.text' at offset 0x6e8 contains 27 entries: + Offset Info Type Sym. Value Sym. Name + Addend +00000000000e 000300000013 R_390_PC32DBL 0000000000000000 .data + 2 +00000000001c 001000000013 R_390_PC32DBL 0000000000000000 sha256_starts + 2 +000000000036 001100000013 R_390_PC32DBL 0000000000000000 sha256_update + 2 +000000000048 001200000013 R_390_PC32DBL 0000000000000000 sha256_finish + 2 +000000000052 000300000013 R_390_PC32DBL 0000000000000000 .data + 102 +00000000005c 001300000013 R_390_PC32DBL 0000000000000000 memcmp + 2 +... +00000000011a 001600000013 R_390_PC32DBL 0000000000000000 setup_arch + 2 +000000000120 000300000013 R_390_PC32DBL 0000000000000000 .data + 122 +000000000130 000f00000013 R_390_PC32DBL 0000000000000000 verify_sha256_digest + 2 +000000000146 001700000013 R_390_PC32DBL 0000000000000000 post_verification[...] + 2 + +Corresponding s390 kernel discussion: +* https://lore.kernel.org/linux-s390/20211208105801.188140-1-egorenar@linux.ibm.com/T/#u + +Signed-off-by: Alexander Egorenkov +Reported-by: Tao Liu +Suggested-by: Philipp Rudo +Reviewed-by: Philipp Rudo +[hca@linux.ibm.com: changed commit message as requested by Philipp Rudo] +Signed-off-by: Heiko Carstens +Signed-off-by: Simon Horman + +Origin: upstream, https://git.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git/commit/?id=186e7b0752d8fce1618fa37519671c834c46340e +Bug-Ubuntu: https://bugs.launchpad.net/bugs/2030476 +Last-Update: 2023-08-08 + +--- + kexec/arch/s390/kexec-elf-rel-s390.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/kexec/arch/s390/kexec-elf-rel-s390.c b/kexec/arch/s390/kexec-elf-rel-s390.c +index a5e1b73..91ba86a 100644 +--- a/kexec/arch/s390/kexec-elf-rel-s390.c ++++ b/kexec/arch/s390/kexec-elf-rel-s390.c +@@ -56,6 +56,7 @@ void machine_apply_elf_rel(struct mem_ehdr *UNUSED(ehdr), + case R_390_PC16: /* PC relative 16 bit. */ + case R_390_PC16DBL: /* PC relative 16 bit shifted by 1. */ + case R_390_PC32DBL: /* PC relative 32 bit shifted by 1. */ ++ case R_390_PLT32DBL: /* 32 bit PC rel. PLT shifted by 1. */ + case R_390_PC32: /* PC relative 32 bit. */ + case R_390_PC64: /* PC relative 64 bit. */ + val -= address; +@@ -63,7 +64,7 @@ void machine_apply_elf_rel(struct mem_ehdr *UNUSED(ehdr), + *(unsigned short *) loc = val; + else if (r_type == R_390_PC16DBL) + *(unsigned short *) loc = val >> 1; +- else if (r_type == R_390_PC32DBL) ++ else if (r_type == R_390_PC32DBL || r_type == R_390_PLT32DBL) + *(unsigned int *) loc = val >> 1; + else if (r_type == R_390_PC32) + *(unsigned int *) loc = val; +-- +2.25.1 + diff -Nru kexec-tools-2.0.22/debian/patches/series kexec-tools-2.0.22/debian/patches/series --- kexec-tools-2.0.22/debian/patches/series 2023-07-03 12:34:26.000000000 +0000 +++ kexec-tools-2.0.22/debian/patches/series 2023-08-09 13:12:40.000000000 +0000 @@ -8,3 +8,4 @@ vmcore-dmesg_man_page_fix.patch 0001-kexec-tools-Remove-duplicate-definition-of-ramdisk.patch lp2024479-arm64-support-more-than-one-crash-kernel-regions.patch +lp2030476-s390-handle-R_390_PLT32DBL-reloc-entries-in-machine.patch