ELF 中的 <.got> 部分是什么?

Jiw*_*won 5 binary x86 elf bin got

据我所知,PLT并且GOT是处理动态链接功能的部分。

如果代码调用printflibc 的函数,
1. 首先它调用PLTgetprintf的地址。
2. 并将此地址写入GOT部分。
3. 从第二次调用开始,代码使用编写的函数GOT

当我仔细查看 ELF 二进制文件时,
- 我发现PLTELF 中的section名称是<.plt>.
-GOT在 ELF 中部分的名称是<.got.plt>.

但是...... <.got>ELF中也有部分。
我无法理解如何使用此部分。



Q.<.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
Run Code Online (Sandbox Code Playgroud)


PS2。我也在这里检查,但答案不足以让我理解 <.got> 部分的用法。

Aug*_*hew 3

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

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

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

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