Busybox 执行官表示找不到 libc.so

Busybox 执行官表示找不到 libc.so

我正在制作一些 Busybox/Linux 操作系统。它适用于静态 busybox 版本,initramfs 和 sysroot 具有相同的内容(除了 init 脚本)。来自 initramfs 的那个设置 PATH 并挂载 /sys、/proc 和 /dev 以及 new_root,然后切换到它。它可以工作,但我想让主 sysroot 使用 busybox 的共享版本,以便外部可执行文件可以使用与 busybox 相同的 libc,这样就不会浪费磁盘空间。我的 Makefile 执行以下步骤:

  1. 获取 linux、busybox、musl 和二进制 i686-linux-musl 工具链的源代码。
  2. 使用工具链配置并编译linux、musl和busybox(将initramfs的静态文件安装到_initramfs_sysroot,将共享文件安装到_sysroot)。
  3. 将数据从 busybox/_initramfs_sysroot 复制到 initramfs/ 并从中创建一个可用的 cpio.gz 档案。
  4. 从 busybox/_sysroot 复制数据并将其复制到 sysroot/。将 musl 安装到 sysroot/usr 并将 sysroot/usr/lib 移动到 sysroot/usr/lib32(因为出于某种原因,busybox 希望 libc 位于此处)。
  5. 制作包含 extlinux 的原始磁盘映像。
  6. 它不起作用。

我所看到的:当尝试switch_root /new_root /etc/rc.d/rc从 initramfs 运行时,Linux 给我一个内核恐慌,说它不存在,但我所做的所有更改是 busybox 现在是共享的,因此我将文件系统挂载到主机操作系统上并执行ldd /mnt/etc/rc.d/rc,它说没有这样的文件 `/usr/lib32/libc.so 然后我决定将 /usr/lib 移动到 /usr/lib32,就像我之前说的那样。但无论如何,我还是得到了同样的错误,即使我将 LD_LIBRARY_PATH 设置为 /usr/lib (libbusybox) 和 /usr/lib32 (libc),就像 PATH 一样 - 在 initramfs 的 init 脚本中,就在将 root 切换到 /new_root 之前。

我发现 musl 的 libc.so 也是一个可执行文件,可以运行需要它的程序。例如,我成功地将 /bin/sh(来自 busybox)作为共享可执行文件运行,/usr/lib32/libc.so /bin/sh它只对 sh 程序有效。我无法通过 shell 运行任何其他程序,但我可以再次使用 libc.so 的“动态程序加载器”(这是 libc 的嵌入式可执行文件的名称或其他任何东西,它将其作为帮助说明)。

答案1

理解问题:

内核崩溃:当内核遇到无法恢复的严重错误时发生。根本原因:在 switch_root 期间无法找到 libc.so。潜在因素:库路径或环境变量不正确。initramfs 或 sysroot 中缺少依赖项。权限或所有权问题。Busybox 或内核中的配置错误。故障排除步骤:

  1. 验证库路径和环境变量:仔细检查 initramfs 初始化脚本中的 LD_LIBRARY_PATH 和 PATH。确保它们指向 libc.so 和 libbusybox.so 的正确位置。在 switch_root 之前打印这些变量以确认它们的值。
  2. 检查 Initramfs 内容:使用 lsinitramfs 列出 initramfs 中的文件。验证 libc.so 和 libbusybox.so(如果需要)是否存在。使用 ldd 检查基本二进制文件上是否存在任何缺失的依赖项。
  3. 检查共享库依赖关系:在已挂载的 sysroot 上使用 ldd /mnt/etc/rc.d/rc 列出依赖关系。确保所有必需的库都存在于 sysroot 或 initramfs 中。
  4. 检查文件权限和所有权:确保 libc.so 和其他库具有适当的权限(通常为 755)。验证所有权,尤其是当文件是从不同来源复制时。
  5. 考虑配置问题:检查与共享库相关的 Busybox 和内核配置选项。确保它们与您的设置兼容。
  6. 检查构建和安装步骤:仔细检查 Makefile 中是否存在错误或不一致。确保正确安装 Busybox、Musl 和其他组件。

相关内容