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

10
据我所知,PLTGOT是用于处理动态链接函数的节区。
如果代码调用了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> 段的用途。


1
这是全局偏移表,动态链接器在其中存储了来自此对象和其他对象的符号的实际运行时绝对地址。PLT/GOT是什么? 在re.SE上有一些链接到明显好的文档。另请参见https://www.macieira.org/blog/2012/01/sorry-state-of-dynamic-libraries-on-linux/。 - Peter Cordes
2
可能是什么是.got和.got.plt部分之间的区别?的重复问题。 - hellow
2个回答

3
Got.plt实际上是.got节的一个较小子集。可以将其想象为指向插槽数组尾部的指针。从概念上讲,它看起来像这样:
Int[10] got; Int* gotplt=&got[5]
Got节基本上包含全局变量和函数的地址。所有全局变量都在前几个插槽中,后缀都是函数指针。gotplt是.got中仅包含函数地址的第一个插槽。
最终,通过plt解析函数地址后,已解析的地址会进入.gotplt,而.gotplt实际上位于我之前提到的.got中。

1

.got --> 全局变量

.got.plt --> 全局函数


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接