4

假设 x86 64 和 linux 平台。

如果查看 ELF 标头,偏移量都是 64 位的。

所以用relocatoin R_X86_64_64很容易创建大于4G的目标文件。这意味着静态 .o 文件和可执行文件可以与 64 位一样大。

但是,对于像 gcc 这样的共享库,我们只有 R_X86_64_PLT32 重定位。这意味着创建大于 4GB 的共享库是不可能的,对吧?

因此,如果我想构建一个庞大的程序,其中一个 .o 文件足够大 (>4GB) ,唯一的选择是静态链接吗?

欢迎任何评论。

谢谢,利米

4

1 回答 1

3

Linux 使用的x86-64 ABI定义了一个“大型模型”,专门用于避免此类大小限制,其中包括 GOT 和 PLT 的 64 位重定位类型。(参见第 4.4.2 节中的表格,以及 3.5.5 中的指令序列,它们显示了它们是如何使用的。)

于 2010-10-21T21:40:14.627 回答