ld-linux.so 解释器,如何构建elf解释器(ld-linux.so.2 / ld-2.17.so)作为静态库?

I would like to be able to set the path to the interpreter with environment variable similar to LD_LIBRARY_PATH, maybe LD_INTERPRETER_PATH.

这根本不可能.仔细阅读(和几次)execve(2),elf(5)& ld.so(8)手册页和Linux ABI& ELF规格.还有内核代码做execve.

ELF解释器负责动态链接.它必须是文件层次结构中某个固定位置的文件(技术上是静态链接的ELF共享库)(通常是/lib/ld.so.2或/lib/ld-linux.so.2或/ lib64 / ld- Linux的x86-64.so.2)

20世纪90年代的旧a.out格式有一个内置的动态链接器,部分在旧的Linux 1.x内核中实现.它的灵活性要低得多,而且不那么强大.

通过这种(原则上)任意动态链接器路径,内核能够具有各种动态链接器.但大多数系统只有一个.这是参数化动态链接器的好方法.如果您想尝试另一个,请将其安装在文件系统中并生成提及该路径的ELF可执行文件.

非常痛苦和努力,您可以创建自己的类似ld.so的动态链接器来实现您的LD_INTERPRETER_PATH愿望,但该链接器仍然必须是位于文件树中某个固定位置的ELF共享库.

如果你想要一个不需要任何文件的系统(在某些预定义和有线位置,比如/lib/ld.so,/ dev / null,/ sbin / init …),你需要构建它所有的可执行二进制文件静态.您可能希望(但当前的Linux发行版通常不这样做)有一些静态链接的可执行文件(如/ sbin / init,/ bin / sash …),这将使您能够修复破坏到的点的系统没有任何动态链接器.

顺便说一句,/ sbin / init -or / bin / sh – 路径连接在内核本身内部.您可以在启动加载时将一些参数传递给内核 – 例如.使用GRUB-覆盖默认值.所以即使内核想要一些文件在这里!

正如我评论的那样,您可以查看MUSL-Libc中的替代Libc实现(提供自己的动态链接器).另请阅读VDSO和ASLR和initrd.

在实践中,接受现代Linux和Unix期望一些非空文件系统的事实……请注意,动态链接和共享库是一个巨大的进步(在20世纪90年代的Linux内核和发行版中更加痛苦).

或者,定义您自己的二进制格式,然后创建内核模块或binfmt_misc条目来处理它.

顺便说一句,大多数(或全部)Linux都是free software,所以你可以改进它(但这需要几个月或多年的工作时间).请通过发布来分享您的改进.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值