出于某些原因,我试图修改和测试我自己版本的rtld (ld-elf.so.1)。在对这个链接器做了每次更改之后,我需要重新启动系统,从CD/DVD中取出它,在/libexec/中安装我的版本,然后再重新启动系统。有时,由于分割错误,它甚至无法运行用户空间。我在这样的过程中浪费了很多时间。
我想问一下,如何在不重新安装/libexec中的rtld并重新启动系统的情况下,从命令行启动这个链接器。是否可以类似于Linux /lib/d-linux.so.2运行rtld?
我试着运行ld-elf.so.1,但是每次我得到分割错误。可能我错过了rtld命令行中的一些参数。对如何从命令行运行rtld有任何建议吗?
也许我可以更改我的可执行文件的默认解释器?
编辑:作为我的rootfs的文件系统,我使用UFS。
发布于 2020-03-22 16:19:16
是否可以类似于Linux
/lib/ld-linux.so.2运行rtld?
是的,只运行/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),它本身不能依赖共享对象,也不能使用另一个解释器。
发布于 2020-03-22 11:04:32
对于rootfs,我使用UFS。
这是个遗憾,因为ZFS的答案非常简单。也许你会把它看作是一个转换的理由。
只要操作系统的静态部分都在一个dataset上,您就可以创建dataset的ZFS克隆,将其挂载到某个子目录中,在那里修改加载程序(或任何要修改的内容),然后创建一个以该子目录作为根目录的监狱。这提供了操作系统的副本,但使用了修改后的加载程序,如果将其安装为主加载程序(就监狱而言,它就是这样)。
(TrueOS展示了这方面的方法,为根和/usr提供了一个大的数据集,并有效地为/var/*、/tmp和/usr/{obj,src,ports,jails,home}等单独的数据集修剪了点。)
这种方法消除了jail手册页和“FreeBSD手册”第14章中概述的用于设置监狱目录树的冗长过程,包括在监狱的根目录中构建整个操作系统副本。ZFS克隆是以真实的根数据集为其来源的快速写入复制。
https://unix.stackexchange.com/questions/574204
复制相似问题