【发布时间】:2018-08-28 15:45:15
【问题描述】:
据我所知,PLT 和GOT 是处理动态链接函数的部分。
如果代码调用 printf 这是 libc 的函数,
1.首先调用PLT获取printf的地址。
2. 并将此地址写入GOT 部分。
3. 从第二次调用开始,代码使用GOT 中编写的函数。
当我仔细研究 ELF 二进制文件时,
- 我在 ELF 中发现 PLT 部分的名称是 <.plt>。
- 在 ELF 中,GOT 部分的名称是 <.got.plt>。
但是……ELF 中也有 <.got> 部分。
我无法理解这部分是如何使用的。
问。 <.got> 部分的用途是什么?<.got> 和<.got.plt> 部分有什么区别?
PS 1. 这个 <.got> 部分非常小,(在我的示例二进制文件中它只包含 4 个字节。)
这里我附上 <.got> 部分的 IDA 视图:
.got:08049FFC ; ===========================================================================
.got:08049FFC
.got:08049FFC ; Segment type: Pure data
.got:08049FFC ; Segment permissions: Read/Write
.got:08049FFC _got segment dword public 'DATA' use32
.got:08049FFC assume cs:_got
.got:08049FFC ;org 8049FFCh
.got:08049FFC __gmon_start___ptr dd offset __imp___gmon_start__
.got:08049FFC ; DATA XREF: _init_proc+F↑r
.got:08049FFC ; __gmon_start__↑r
.got:08049FFC _got ends
.got:08049FFC
PS2。我也查了here,但答案不足以让我理解<.got>部分的用法。
【问题讨论】:
-
它是全局偏移表,动态链接器在其中存储来自此对象和其他对象的符号的实际运行时绝对地址。 re.SE 上的What is PLT/GOT? 有一些指向显然不错的文档的链接。另见macieira.org/blog/2012/01/…。