【发布时间】:2013-07-29 04:10:50
【问题描述】:
如果我的问题不准确,我深表歉意,因为我没有很多 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。
【问题讨论】:
-
我认为更改 ELF 程序解释器是个坏主意(除非您是 Linux 和 binutils 大师);它是用 Glibc 构建的。您可以尝试其他方法(例如 MUSL-Libc...)。你为什么要改变它?到什么动态加载器?如果您不想依赖它的位置和存在(这是一个坏主意),请放弃动态链接并仅使用静态链接的程序。并且动态链接器
/lib/ld-linux.so.2是静态构建的(但仍然是一个共享库,除了内核提供的VDSO之外不使用任何外部库)。 -
动态链接是动态的,不依赖于静态位置。这种[硬连线]方法是完全错误的。我想在我的系统中修复它。解决方案很简单,只是我对所有方面都不够熟悉,无法自己解决。
-
然后,修补内核以满足您的需要。然后你必须修补工具链(编译器和链接器)以服从它们。事实上,所有这些都是免费软件,您可以改进它。
-
当然,这是下一步要做的事情,但我希望 Linux 在这么多年后能够更加进化,这就是我问的原因。没想到会遇到这样的[找不到合适的词]障碍。
-
Stack Overflow 不是讨论 Linux 内核设计或链接器功能的最佳场所。为此使用更专业的论坛。
标签: linux gcc glibc elf linux-from-scratch