【发布时间】:2015-12-30 15:04:03
【问题描述】:
我发现许多程序(例如 /bin 下的程序)仍然有 .got 部分,但它们不是 pie。但有趣的是,.got 的大小总是 4 个字节。这个 .got 可能没有实际用途吗?如果是,这些非饼程序如何访问外部全局变量?
【问题讨论】:
标签: gcc elf dynamic-linking
我发现许多程序(例如 /bin 下的程序)仍然有 .got 部分,但它们不是 pie。但有趣的是,.got 的大小总是 4 个字节。这个 .got 可能没有实际用途吗?如果是,这些非饼程序如何访问外部全局变量?
【问题讨论】:
标签: gcc elf dynamic-linking
.got 不仅与位置无关代码有关。它还包含共享对象的链接信息。通过readelf和objdump查看该部分的内容
主要区别在于 PIE 具有“内部”动态链接。这种内部动态链接适用于 ASLR 的用途。在 PIE 二进制文件之前,只有动态库位于随机偏移处,但在 ASLR 之后,可执行文件也可以这样,这样的可执行文件称为 PIE 二进制文件
【讨论】:
.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 提供了一些细节,但是是的:该符号对于没有分析支持的任何程序都没有实际价值。它之所以存在只是因为它的成本并不高,而摆脱它(同时仍为分析提供支持)比节省的成本更麻烦。
【讨论】: