如果我的问题不准确,我深表歉意,因为我没有很多 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 的任何平台上运行。
一些可能相关的背景:我正在使用 Slackware 14 x86 来构建 i686 编译器工具链,所以总的来说它都是 x86 主机和目标。我正在使用 glibc 2.17 和 gcc 4.7.x。