我发现许多程序(例如/ bin下的程序)仍然具有.got部分,而它们是非饼状的。但有趣的是,.got的大小总是4个字节。这个.got有可能没用吗?如果是这样,这些非饼图程序如何访问外部全局变量?
答案 0 :(得分:0)
.got
不仅关注与位置无关的代码。它还包含共享对象的链接信息。通过readelf
和objdump
主要区别在于PIE具有“内部”动态链接。这种内部动态链接适用于ASLR的用途。在PIE二进制文件之前,只有动态库可以随机偏移,但在ASLR可执行文件之后也是如此,这些可执行文件称为PIE二进制文件
答案 1 :(得分:0)
需要.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提供了一些细节,但是:对于没有分析支持而构建的任何程序,该符号没有实际价值。它只是存在,因为它不会花费太多,并且摆脱它(虽然仍然提供分析支持)比节省的价值更麻烦。