据我所知,
如果代码调用了libc的函数
1. 首先它会调用
经仔细查看ELF二进制文件发现:
- 我发现在ELF中
但是... ELF中也有一个
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>
节区有什么区别?
附注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. 我也查看了这里,但是答案没有让我完全理解 <.got> 段的用途。