Linux相关经验.我目前正在构建一个linux
刮擦(主要是遵循linuxfromscratch.org版本的指南
7.3).我遇到了以下问题:当我构建一个可执行文件时
得到一个名为ELF解释器的硬编码路径.
readelf -l program
显示类似的东西
[Requesting program interpreter: /lib/ld-linux.so.2]
我跟踪这个库ld-linux-so.2是glibc的一部分.我不是很好
对此行为感到高兴,因为它使二进制文件非常不可移植
– 如果我改变了/lib/ld-linux.so.2的位置,那么可执行文件号
更长的工作和我发现的唯一“修复”是使用patchelf实用程序
从NixOS将硬编码路径更改为另一个硬编码路径.对于
这个原因我想链接到ld的静态版本
图书馆,但不生产.所以这是我的问题,可以
你请解释我怎样才能构建glibc以便它能产生一个
我可以稍后链接到我的ld-linux.so.2的静态版本
可执行文件.我不完全理解这个ld库的作用,但是我
假设这是加载其他动态库的部分(或者
至少glibc.so).我想动态链接我的可执行文件,但是
我希望动态链接器本身可以静态内置
他们,所以他们不会依赖硬编码的路径.或者我
希望能够设置解释器的路径
也许是类似于LD_liBRARY_PATH的环境变量
LD_INTERPRETER_PATH.目标是能够生产便携式产品
二进制文件,无论如何都可以在具有相同ABI的任何平台上运行
目录结构是什么.
一些可能相关的背景:我正在使用@R_887_4046@ 14 x86
构建i686编译器工具链,所以整体来说它都是x86主机和
目标.我正在使用glibc 2.17和gcc 4.7.x.
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,所以你可以改进它(但这需要几个月或多年的工作时间).请通过发布来分享您的改进.
另请阅读Drepper’s Hwo to Write Shared Libraries论文;和this question.
总结以上是内存溢出为你收集整理的如何构建elf解释器(ld-linux.so.2 / ld-2.17.so)作为静态库?全部内容,希望文章能够帮你解决如何构建elf解释器(ld-linux.so.2 / ld-2.17.so)作为静态库?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)