据我所知,PLT
是GOT
处理动态链接函数的部分。
如果代码调用printf
了libc的函数,
1.首先调用PLT
获取printf
地址。
2. 并将此地址写入GOT
段。
3. 从第二次调用开始,代码使用GOT
.
当我仔细查看 ELF 二进制文件时,
- 我发现 ELF 中 sectionPLT
的名称是<.plt>
.
- GOT
ELF 中的部分名称是<.got.plt>
.
但是...... ELF中也有<.got>
部分。
我无法理解这部分是如何使用的。
Q.<.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> 部分的用法。