如何构建elf解释器(ld-linux.so.2 / ld-2.17.so)作为静态库?
如果我的问题不准确,我道歉,因为我没有太多
Linux相关经验.我目前正在构建一个Linux 刮擦(主要是遵循linuxfromscratch.org版本的指南 7.3).我遇到了以下问题:当我构建一个可执行文件时 得到一个名为ELF解释器的硬编码路径. readelf -l program 显示类似的东西 [Requesting program interpreter: /lib/ld-linux.so.2] 我跟踪这个库ld-linux-so.2是glibc的一部分.我不是很好 一些可能相关的背景:我正在使用Slackware 14 x86 解决方法
这根本不可能.仔细阅读(和几次)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,所以你可以改进它(但这需要几个月或多年的工作时间).请通过发布来分享您的改进. 另请阅读Drepper’s Hwo to Write Shared Libraries论文;和this question. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |