【问题标题】:Why do many non-PIE programs still have .got section?为什么许多非 PIE 程序仍然有 .got 部分?
【发布时间】:2015-12-30 15:04:03
【问题描述】:

我发现许多程序(例如 /bin 下的程序)仍然有 .got 部分,但它们不是 pie。但有趣的是,.got 的大小总是 4 个字节。这个 .got 可能没有实际用途吗?如果是,这些非饼程序如何访问外部全局变量?

【问题讨论】:

    标签: gcc elf dynamic-linking


    【解决方案1】:

    .got 不仅与位置无关代码有关。它还包含共享对象的链接信息。通过readelfobjdump查看该部分的内容

    主要区别在于 PIE 具有“内部”动态链接。这种内部动态链接适用于 ASLR 的用途。在 PIE 二进制文件之前,只有动态库位于随机偏移处,但在 ASLR 之后,可执行文件也可以这样,这样的可执行文件称为 PIE 二进制文件

    【讨论】:

    • 现在它通过 .got 和 .plt 访问外部全局变量和函数,它似乎与位置无关。为什么它仍然被称为非 PIE?换句话说,PIE和非PIE有什么区别?@shami
    • PIE 二进制文件允许 ASLR 用于安全性,而 NON-PIE 不允许。检查维基百科。两者都使用 ELF 的许多部分来完成他们的工作。我认为您正在将动态重定位与 PIE 混合在一起。动态重定位使用来自 .got 的信息
    • 恐怕你没有回答我的问题。维基百科说与位置无关的可执行文件 (PIE) 是完全由与位置无关的代码制成的可执行二进制文件。我知道 PIC 是如何工作的。鉴于 /bin 下的程序确实有 .got.plt 和 .plt 这意味着它们使用与 PIC 相同的方式来实现动态链接,为什么它们仍然不是位置无关的。除了动态链接之外,还有什么可以使可执行文件与位置无关?@shami
    • 抱歉回复晚了,我正在度假。答案已更新
    • 有趣!但什么是“内部”动态链接?你能详细说明一下吗?
    【解决方案2】:

    .got 部分用于从主可执行文件(其本身可能与位置无关)访问共享对象(与位置无关的)中的全局数据。你可以阅读血淋淋的细节here

    .got 的大小始终为 4 个字节

    在 64 位 x86_64 系统上,我的 /bin 中的所有二进制文件都是 8 个字节。

    有没有可能这个.got没有实际用处?

    .got 在我的/bin/date 中引用的唯一符号是:

    objdump -R /bin/date | grep GLOB
    000000000060dff8 R_X86_64_GLOB_DAT  __gmon_start__
    

    这个answer 提供了一些细节,但是是的:该符号对于没有分析支持的任何程序都没有实际价值。它之所以存在只是因为它的成本并不高,而摆脱它(同时仍为分析提供支持)比节省的成本更麻烦。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 2012-10-31
      • 2020-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多