我很抱歉,我的问题可能不够精确,因为我没有很多与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的位置,可执行文件就无法工作了,我唯一找到的“解决方法”是使用来自NixOS的patchelf实用程序将硬编码的路径更改为另一个硬编码的路径。因此,我希望链接静态版本的ld库,但是这样做并没有产生效果。因此,我的问题是,您能否请说明如何构建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。
/lib/ld-linux.so.2
是静态构建的(但仍然是共享库,不使用任何外部库,除了内核提供的VDSO)。 - Basile Starynkevitcha.out
解决方案的重大改进。而ELF并非仅适用于Linux,Solaris(以及可能是AIX)也同样使用它。 - Basile Starynkevitch