Package: src:klibc Hi maks,
This problem is finally understood and fixed, thanks to Alan Modra and Ulrich Weigand (binutils / ELFv2 experts). The patch was submitted upstream. Here's a debdiff for your convenience. I would ask you (or a non-maintainer) to consider it for an upload, since any initrd generated without it fails to boot, with a segfault. Thank you, -- Mauricio Faria de Oliveira IBM Linux Technology Center
diff -Nru klibc-2.0.3/debian/changelog klibc-2.0.3/debian/changelog --- klibc-2.0.3/debian/changelog 2014-04-21 14:52:41.000000000 -0300 +++ klibc-2.0.3/debian/changelog 2014-09-09 19:37:02.000000000 -0300 @@ -1,3 +1,10 @@ +klibc (2.0.3-1ppc64el1) UNRELEASED; urgency=medium + + * Add ppc64el-load-toc-syscall-stub.patch: fix segfault on dynamically-linked + binaries on ppc64el. (Closes: #749060) + + -- Mauricio Faria de Oliveira <mauri...@linux.vnet.ibm.com> Tue, 09 Sep 2014 19:33:37 -0300 + klibc (2.0.3-1) unstable; urgency=medium * New upstream release (arm64, ppc64) (closes: #698018, #744884) diff -Nru klibc-2.0.3/debian/patches/ppc64el-load-toc-syscall-stub.patch klibc-2.0.3/debian/patches/ppc64el-load-toc-syscall-stub.patch --- klibc-2.0.3/debian/patches/ppc64el-load-toc-syscall-stub.patch 1969-12-31 21:00:00.000000000 -0300 +++ klibc-2.0.3/debian/patches/ppc64el-load-toc-syscall-stub.patch 2014-09-09 19:35:38.000000000 -0300 @@ -0,0 +1,55 @@ +Subject: [klibc] [PATCH] ppc64: ELFv2: Load TOC value in system call stub +Origin: http://www.zytor.com/pipermail/klibc/2014-September/003603.html + +This fixes a segmentation fault in the system call's error handling path with +dynamically-linked binaries on PowerPC64 little endian. The system call stub +wasn't loading up r2 with the appropriate TOC value in its global entry point. + +The r2 setup code comes from the FUNC_START macro in gcc [1] and an equivalent +one can also be found in the LOCALENTRY macro in glibc [2]. + +On the ELFv2 ABI (see [1]): + - The global entry point is expected to load up r2 with the appropriate TOC + value for this function. + - The local entry point expects r2 to be set up to the current TOC. + +The problem happened with dynamically-linked binaries because: + - the system call is an indirect call (via global entry point) from the binary + to the shared library, landing in the syscall stub (which didn't load up r2 + with the TOC of the shared library) + - its branch to __syscall_error is a direct call (via local entry point) within + the shared library, landing in the function (which expects r2 to be set up to + that TOC) + - when the function attempts to store errno (in an address relative to the TOC), + that address incorrectly pointed to a read-only segment -- segmentation fault. + +The problem didn't happen with statically-linked binaries because the TOC value +wasn't different on that case. + +Thanks and credits to Alan Modra and Ulrich Weigand, for helping with this and +pointing out the solution. + +[1] https://gcc.gnu.org/ml/gcc-patches/2013-11/msg01141.html +[2] https://www.sourceware.org/ml/libc-alpha/2013-11/msg00315.html + +Signed-off-by: Mauricio Faria de Oliveira <mauricfo at linux.vnet.ibm.com> +--- + usr/klibc/arch/ppc64/sysstub.ph | 3 +++ + 1 files changed, 3 insertions(+), 0 deletions(-) + +diff --git a/usr/klibc/arch/ppc64/sysstub.ph b/usr/klibc/arch/ppc64/sysstub.ph +index b3f6e38..a0c6d41 100644 +--- a/usr/klibc/arch/ppc64/sysstub.ph ++++ b/usr/klibc/arch/ppc64/sysstub.ph +@@ -18,6 +18,9 @@ sub make_sysstub($$$$$@) { + #if _CALL_ELF == 2 + .type ${fname},\@function + ${fname}: ++0: addis 2,12,(.TOC.-0b)\@ha ++ addi 2,2,(.TOC.-0b)\@l ++ .localentry ${fname},.-${fname} + #else + .section ".opd","aw" + .balign 8 +-- +1.7.1 diff -Nru klibc-2.0.3/debian/patches/series klibc-2.0.3/debian/patches/series --- klibc-2.0.3/debian/patches/series 2014-04-21 14:10:10.000000000 -0300 +++ klibc-2.0.3/debian/patches/series 2014-09-09 19:33:26.000000000 -0300 @@ -4,3 +4,4 @@ insmod multiarch-include-path Fix-minimal-mv-to-work-across-fs +ppc64el-load-toc-syscall-stub.patch