FreeBSD 测试 rtld

FreeBSD 测试 rtld

由于某些原因,我正在尝试修改和测试我自己的 rtld 版本(ld-elf.so.1)。每次对此链接器进行更改后,我都需要重新启动系统,从 CD/DVD 启动它,在 /libexec/ 中安装我的版本,然后再次重新启动系统。有时,由于分段错误,它甚至不运行用户空间。我在这样的过程中浪费了很多时间。

我想问如何从命令行启动此链接器,而无需在 /libexec 中重新安装 rtld 并重新启动系统。是否可以像 Linux /lib/ld-linux.so.2 一样运行 rtld?

我尝试运行 ld-elf.so.1 但每次都会出现分段错误。可能我错过了 rtld 命令行中的一些参数。关于如何从命令行运行 rtld 有什么建议吗?

也许我可以更改可执行文件的默认解释器?

编辑:作为我的 rootfs 的文件系统,我使用 UFS。

答案1

是否可以像Linux一样运行rtld /lib/ld-linux.so.2

是的,/libexec/ld-elf.so.1 /path/to/your_binary在 FreeBSD 上运行得很好,就像在 Linux 上一样。

也许我可以更改可执行文件的默认解释器?

是的,您可以在编译二进制文件时通过cc -Wl,-dynamic-linker=/path/to/your_interpreter.这-Wl,..是 gcc/clang 将参数直接传递给链接器的方式,您可以查看联机帮助页以获取对其和其他标志ld(1)的解释。--dynamic-linker

我尝试运行ld-elf.so.1,但每次都会遇到分段错误。

动态链接器/解释器应编译为位置独立 ( -pie),并且本身不能依赖于共享对象,或使用其他解释器。

答案2

对于我的 rootfs,我使用 UFS。

这很遗憾,因为 ZFS 的答案非常简单。也许您会将此视为转换的理由。

只要操作系统的静态部分都在一个数据集上,您就可以创建一个 ZFS克隆数据集的数据集,将其挂载到某个子目录中,修改那里的加载程序(或您想要修改的任何内容),然后创建一个以该子目录作为根的监狱。这提供了操作系统的写时复制副本,但使用了修改后的加载程序,就地就像作为主加载程序安装一样(这是就监狱而言)。

(TrueOS 展示了这种方法,为根提供一个大数据集,并/usr有效地为诸如 、 和 之类的单独数据集修剪/var/*/tmp/usr/{obj,src,ports,jails,home}

这种方法消除了jail手册页和手册第 14 章中概述的冗长过程。FreeBSD 手册,用于设置监狱目录树,涉及在监狱的根目录中构建操作系统的完整副本。 ZFS 克隆是一种快速的写入时复制,以真实的根数据集作为其来源。

相关内容