【问题标题】:What is the point of the Global Offset Table?全局偏移表的意义何在?
【发布时间】:2015-02-11 12:03:45
【问题描述】:

GOT 工作的全部原因是代码和数据部分之间的偏移量是恒定的;因此,代码与数据部分中某些给定数据之间的偏移量是恒定的。

This SO question 解决了这个问题,并确认对于库中定义的数据,GOT 是冗余的。

剩下的唯一可能是在库中使用但在其他地方定义的数据。

因此,这是 GOT 在共享库中的唯一点,能够通过将所有重定位本地化到其他共享库中定义的符号来保持该库的代码段位置独立,在得了?

【问题讨论】:

  • 您正在忽略符号插入:macieira.org/blog/2012/01/…。这使得在共享库中访问您自己的全局变量和函数效率低下,除非您将它们的 ELF 可见性设置为 hidden

标签: linker loader


【解决方案1】:

因此,共享库中 GOT 的唯一点是能够通过将所有重定位本地化到 GOT 中其他共享库中定义的符号来保持该库的代码段位置独立?

你说得对,GOT 是允许代码可重定位的机制。

但是,它适用于传统的共享对象和程序。由于位置无关代码 (PIE)(也称为地址空间布局随机化),它适用于程序。

一般来说,PIE 是 PIC 的一个子集。也就是说,您可以使用-fPIC 编译所有代码(程序和共享库)。然而,反过来不是是正确的。您不能使用-fPIE 编译所有代码(程序和共享库)。共享库需要-fPIC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-04
    • 2012-03-30
    • 2021-11-26
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多