据我所知,
PLT
和GOT
是处理动态链接函数的部分。
如果代码调用
printf
(libc 的函数),PLT
获取printf
的地址。GOT
部分。GOT
中编写的函数。
当我仔细研究 ELF 二进制文件时,
- 我发现ELF中
PLT
部分的名称是<.plt>
。GOT
部分在ELF中的名称是<.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>部分的用法。
Got.plt 实际上是 .got 部分的较小子集。想象一下指向槽数组的尾部。从概念上讲,它看起来像这样
Int[10]得到; int* gotplt=&got[5]
Got 部分基本上可以包含全局变量和函数的地址。所有全局变量都在前几个槽中,后缀都是指向函数的指针。 gotplt 是第一个槽 .got,仅包含函数地址..
最终通过 plt. 解析函数地址后。解析后的地址进入 .gotplt,顺便说一句,正如我之前提到的,它位于 .got 内部。
.got
--> 全局变量
.got.plt
--> 全局函数