9f65cc
From c6d8832f86bc2ef7fbab6f703479816dd6078902 Mon Sep 17 00:00:00 2001
9f65cc
From: Pingfan Liu <piliu@redhat.com>
9f65cc
Date: Fri, 9 Jul 2021 11:55:16 +0800
9f65cc
Subject: [PATCH] fix(squash): keep ld cache under initdir
9f65cc
9f65cc
When running kdump on PowerPC, the following bug is hit:
9f65cc
[    0.391629] Freeing unused kernel memory: 5568K
9f65cc
[    0.391634] This architecture does not have kernel memory protection.
9f65cc
/bin/sh: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
9f65cc
[    0.392214] Kernel panic - not syncing: Attempted to kill init! exitcode=0x00007f00
9f65cc
[    0.392214]
9f65cc
[    0.392223] CPU: 6 PID: 1 Comm: init Not tainted 4.18.0-319.el8.ppc64le #1
9f65cc
[    0.392228] Call Trace:
9f65cc
[    0.392234] [c00000000c703c10] [c000000008ecb94c] dump_stack+0xb0/0xf4 (unreliable)
9f65cc
[    0.392243] [c00000000c703c50] [c000000008167324] panic+0x148/0x3c4
9f65cc
[    0.392249] [c00000000c703cf0] [c000000008170474] do_exit+0xcd4/0xd40
9f65cc
[    0.392255] [c00000000c703dc0] [c0000000081705b0] do_group_exit+0x60/0x110
9f65cc
[    0.392261] [c00000000c703e00] [c000000008170684] sys_exit_group+0x24/0x30
9f65cc
[    0.392268] [c00000000c703e20] [c00000000800b408] system_call+0x5c/0x70
9f65cc
9f65cc
This is due to the non-conventional library path:
9f65cc
ldd /bin/bash
9f65cc
        linux-vdso64.so.1 (0x00007fffbdc90000)
9f65cc
        libtinfo.so.6 => /lib64/libtinfo.so.6 (0x00007fffbda80000)
9f65cc
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fffbda50000)
9f65cc
        libc.so.6 => /lib64/glibc-hwcaps/power9/libc-2.28.so (0x00007fffbd830000)
9f65cc
                            ^^^
9f65cc
        /lib64/ld64.so.2 (0x00007fffbdcb0000)
9f65cc
9f65cc
ldd finds the path by libc.so.6 -> /usr/lib64/libc.so.6 ->
9f65cc
/usr/lib64/glibc-hwcaps/power9/libc-2.28.so and cache the result. So
9f65cc
when dracut_install, it only saw
9f65cc
'/usr/lib64/glibc-hwcaps/power9/libc-2.28.so' and blind to
9f65cc
'/usr/lib64/libc.so.6'
9f65cc
9f65cc
In the final kdumpimg, the symlink /usr/lib64/libc.so.6 is not created,
9f65cc
hence ld.so can not find the /usr/lib64/glibc-hwcaps/power9/libc-2.28.so
9f65cc
9f65cc
On the other hand, during the process of building kdumpimg, all of dynamic library info
9f65cc
have been cached in ld.so.cache. Hence this bug can be simplely resolved
9f65cc
by keeping ld cache under $initdir/etc.
9f65cc
9f65cc
Signed-off-by: Pingfan Liu <piliu@redhat.com>
9f65cc
---
9f65cc
v3 -> v4:
9f65cc
  use inst() instead of copy
9f65cc
v2 -> v3:
9f65cc
  fix format by shfmt -s -w modules.d/99squash/module-setup.sh
9f65cc
v1 -> v2:
9f65cc
  cp -r /etc/ld.so* instead of move, since after switch-root, initdir
9f65cc
can not be seen any longer
9f65cc
9f65cc
(cherry picked from commit dc21638c3f0acbb54417f3bfb6294ad5514bf2db)
9f65cc
9f65cc
Resolves: #1959336
9f65cc
---
9f65cc
 modules.d/99squash/module-setup.sh | 5 +++++
9f65cc
 1 file changed, 5 insertions(+)
9f65cc
9f65cc
diff --git a/modules.d/99squash/module-setup.sh b/modules.d/99squash/module-setup.sh
9f65cc
index 8c9982c0..14790ce8 100644
9f65cc
--- a/modules.d/99squash/module-setup.sh
9f65cc
+++ b/modules.d/99squash/module-setup.sh
9f65cc
@@ -28,6 +28,11 @@ installpost() {
9f65cc
         [[ "$squash_dir" == "$i"/* ]] || mv "$i" "$squash_dir"/
9f65cc
     done
9f65cc
 
9f65cc
+    # initdir also needs ld.so.* to make ld.so work
9f65cc
+    inst /etc/ld.so.cache
9f65cc
+    inst /etc/ld.so.conf
9f65cc
+    inst_dir /etc/ld.so.conf.d/
9f65cc
+
9f65cc
     # Create mount points for squash loader
9f65cc
     mkdir -p "$initdir"/squash/
9f65cc
     mkdir -p "$squash_dir"/squash/
9f65cc