据我所知,PLT
和GOT
是处理动态链接功能的部分。
如果代码调用libc的功能printf
,
1.首先,它调用PLT
以获得printf
的地址。
2.将此地址写入GOT
部分。
3.从第二次调用开始,代码使用用GOT
编写的函数。
当我仔细研究ELF二进制文件时,
-我发现ELF中PLT
节的名称是<.plt>
。
-ELF中GOT
节的名称是<.got.plt>
。
但是... ELF中还有<.got>
部分。
而且我不明白如何使用此部分。
问。 <.got>
部分的用途是什么?
<.got>
和<.got.plt>
部分之间有什么区别?
PS 1.此<.got>
部分非常小((在我的示例二进制文件中仅保留4byte。)
在这里,我附上<.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>部分的用法。