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

问题描述 投票:0回答:2

据我所知,

PLT
GOT
是处理动态链接函数的部分。

如果代码调用

printf
(libc 的函数),
1. 首先调用
PLT
获取
printf
的地址。
2. 并将此地址写入
GOT
部分。
3. 从第二次调用开始,代码使用
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>部分的用法。

x86 binary elf bin got
2个回答
2
投票

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

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

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

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


1
投票

.got
--> 全局变量

.got.plt
--> 全局函数

© www.soinside.com 2019 - 2024. All rights reserved.