Linux   发布时间:2022-05-08  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何构建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的一部分.我不是很好
对此行为感到高兴,因为它使二进制文件非常不可移植
– 如果我改变了/lib/ld-linux.so.2的位置,那么可执行文件号
更长的工作和我发现的唯一“修复”是使用patcHelf实用程序
从NixOS将硬编码路径更改为另一个硬编码路径.对于
这个原因我想链接到l​​d的静态版本
图书馆,但不生产.所以这是我的问题,可以
你请解释我怎样才能构建glibc以便它能产生一个
我可以稍后链接到我的ld-linux.so.2的静态版本
可执行文件.我不完全理解这个ld库的作用,但是我
假设这是加载其他动态库的部分(或者
至少glibc.so).我想动态链接我的可执行文件,但是
我希望动态链接器本身可以静态内置
他们,所以他们不会依赖硬编码的路径.或者我
希望能够设置解释器的路径
也许是类似于LD_LIBRARY_PATH的环境变量
LD_INTERPRETER_PATH.目标是能够生产便携式产品
二进制文件,无论如何都可以在具有相同ABI的任何平台上运行
目录结构是什么.

一些可能相关的背景:我正在使用Slackware 14 x86
构建i686编译器工具链,所以整体来说它都是x86主机和
目标.我正在使用glibc 2.17和gcc 4.7.x.

解决方法

这根本不可能.仔细阅读(和几次)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)作为静态库?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:我道歉