7

据我所知,PLTGOT处理动态链接函数的部分。

如果代码调用printf了libc的函数,
1.首先调用PLT获取printf地址。
2. 并将此地址写入GOT段。
3. 从第二次调用开始,代码使用GOT.

当我仔细查看 ELF 二进制文件时,
- 我发现 ELF 中 sectionPLT的名称是<.plt>.
- GOTELF 中的部分名称是<.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> 部分的用法。

4

1 回答 1

1

Got.plt 实际上是 .got 部分的较小子集。想想指向一组插槽的尾部。从概念上讲,它看起来像这样

Int[10] 得到;int* gotplt=&got[5]

Got 部分基本上可以包含全局变量和函数的地址。所有全局变量都在前几个槽中,后缀都是指向函数的指针。gotplt 是第一个仅包含函数地址的插槽 .got ..

最终在函数地址通过 plt. 解析的地址进入 .gotplt,顺便说一句,正如我之前提到的,它在 .got 中。

于 2021-09-28T18:48:11.520 回答