由于某些原因,我正在尝试修改和测试我自己的 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 克隆是一种快速的写入时复制,以真实的根数据集作为其来源。