问题标签 [got]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2084 浏览

linux - 查找 PLT 存根的地址

我正在研究 Linux X86_64。

在给定条目所代表的动态函数的名称的情况下,我需要确定 ELF 文件中特定 PLT 条目的地址。我可以从地址中找出文件偏移量,但我需要能够确定地址。

如果我使用反汇编 ELF 文件,objdump -D -z elffile我会看到 objdump 为 PLT 中的每个条目使用符号名称。(objdump从哪里获得这些地址和符号名称之间的关系?)

例子:

如果我使用objdump -T elffile | grep fileno我会得到这样的东西:

我需要能够从“C”做的是在ELF文件中找到特定动态函数的PLT条目并获取地址。

背景是我正在修补现有的 ELF 文件,需要将函数调用重定向到不同的动态函数。我已经使用从 objdump 反汇编收集的地址手动修补了 ELF 文件,并证明这适用于我的特定应用程序,我只需要能够从程序中完成它。我希望不必爬过 objdump 反汇编代码来弄清楚它是如何获取 PLT 条目符号和地址的。

0 投票
1 回答
221 浏览

x86 - 每个 .so 文件都有 PLT/GOT 吗?

我一直在考虑这个问题,因为我观察到即使是像 libc 这样的非常基础的库也有一个 GOT/PLT,它由 malloc() 和它的朋友等重要功能组成。

甚至可以创建一个没有 GOT/PLT 的共享库吗?在学术活动之外,这样的图书馆会在野外出现吗?(如果有帮助,请仅考虑 x86 平台)

我的直觉告诉我,这些问题的答案分别是“否”和“是”,但我都不是 100% 确定的。

仅包含 C 类型列表的 .so 文件是否可能没有 GOT/PLT?也许吧,但我不明白为什么当你可以#include一个.h文件来做到这一点时,为什么会在实践中发生这种情况!

0 投票
1 回答
872 浏览

assembly - 为什么要从 PLT 跳到 GOT 而不是直接跳到 GOT?

我正在研究如何在动态链接中使用 GOT 和 PLT。我很困惑为什么每个动态链接的函数调用似乎都会跳转到 PLT 中的某个位置,而该位置总是会跳转到 GOT 中的相同位置。为什么不直接跳到 GOT 中的那个位置呢?为什么需要另一层间接?


我可能从根本上对 GOT 和 PLT 有一些误解,所以这里简要描述一下我对如何使用 PLT 和 GOT 的概念理解。

我们有一个名为 FunctionX 的函数,PLT 中的对应位置为 PLT[X],GOT 中的对应位置为 GOT[X]。PLT 和 GOT 的地址在编译时是已知的,但 FunctionX 的地址不知道。

为了调用 FunctionX:

1) 调用(在汇编意义上)PLT[X] 的地址。

2) PLT[X] 是跳转到 GOT[X] 所包含的值。

3a) 如果 FunctionX 已经解析,GOT[X] 包含函数地址,所以第 2 步是跳转到 FunctionX。

3b) 否则,GOT[X] 包含将在运行时解析 FunctionX 的地址的代码地址,将该地址写入 GOT[X],然后跳转到 FunctionX。在这种情况下,步骤 2 会导致 FunctionX 被解析,然后跳转到。

第 1 步的目的是什么?

我对这个话题的理解是粗略的,所以请指出任何可以帮助这个问题的澄清。

0 投票
1 回答
377 浏览

linux - GOT[0](全局偏移表)在哪里使用?

我知道“GOT[1] 指向 Link_map 结构”,“GOT[2] 指向 _dl_runtime_resolver_”。但我找不到使用 GOT[0] 的地方。

有人知道 GOT[0] 在哪里使用吗?

0 投票
1 回答
3310 浏览

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

据我所知,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 视图:


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

0 投票
0 回答
68 浏览

assembly - 为什么某些链接器制作的汇编代码位于 GOT 而不是 PLT?

链接后一些库函数如下所示。


所以,我了解了@plt反汇编的用法。

然而,昨天,我有些奇怪的代码切片。
以下是 的一部分libstdbuf.s,包含在Coreutils

如您所见,代码访问stdin@GOT.

嗯...我以前从未见过blabla@GOT语法..



问题:

  1. 线路具体是做什么stdin@GOT(%ebx), %eax的?

  2. 这是链接器生成的代码吗?如果,为什么是在GOT,而不是PLT

  3. 还有..我怎么知道stdin@GOT地址信息?
    (与一般的全局符号不同,地址未显示在符号表上。见下文)

.

0 投票
1 回答
308 浏览

linux - 我可以通过“GOT 地址”获取符号名称吗?

现在我正在开发程序,比如readelf使用pyelftools库。

我想打印如下表。
在这里,Offset字段是stderr@GOT地址。


假设我只有00001c50未知符号的 GOT 地址()。

我的情况是我想get_symname_by_GOTaddress00001c50tostderr@GLIBC_2.0

问题:但是,我找不到二进制之间的GOT address任何symbol name我怎么才能得到它?

0 投票
2 回答
1532 浏览

assembly - GAS Intel 语法中的 GOTPCREL(%rip)

我如何编写以下内容:movq variable@GOTPCREL(%rip), %r8在 GAS Intel 语法中?

.intel_syntax noprefix只允许这样:mov r8, variable@GOTPCREL,它不理解(),并且生成的代码不同-我收到分段错误。如何指定 RIP 相对寻址?

此时我必须使用以下语法切换器:

我更喜欢 Intel 语法,我的代码主要使用。在将代码移植到 GAS 时,此切换器很不方便。是否可以用 Intel 语法快速编写它?

0 投票
2 回答
2246 浏览

unix - 两个进程如何共享同一个共享库?

我一直在尝试更好地了解共享库的工作原理,但我无法解决两件事。

1-每个进程都有自己的虚拟内存空间和页表,所以如果一个共享库被加载到一个进程的虚拟内存空间中,那么第二个进程如何访问该共享库,因为它不在其内存空间中?

2-我知道只有文本部分被共享而全局数据不被共享,这怎么可能?我的理解是,对全局变量的每个引用都是通过全局偏移表(简称 GOT)完成的。所以,如果我有这行代码,x = glob那么这将大致等于mov eax,DWORD PTR [ecx-0x10]汇编中ecx的内容,其中用作 GOT 的基值。但如果是这种情况,那么很明显,无论哪个进程调用该行,它总是会访问同一个全局变量,其地址位于 GOT 中的偏移量 0x10。那么,如果两个进程使用引用相同 GOT 条目的相同文本部分,那么它们如何拥有不同的全局变量副本呢?

0 投票
1 回答
158 浏览

linux - 为什么 pie 二进制文件中不允许使用“symbol@GOT”?

这是示例程序集文件,test.s

我尝试用-pie标志编译它,但失败了。

错误说,在 pie 二进制文件中,GOT只能使用基址寄存器访问条目。

问题。
我不知道为什么编译器会像上面那样抱怨。
更具体地说,为什么__progname@GOTpie 二进制文件不允许寻址?



我的意见。
Loader 知道__progname@GOTpie 二进制文件在加载时的地址。

__progname@GOT因此,加载程序可以简单地在加载时间的位置写入这个地址。
这就是装载机可以做的。

所以我不明白为什么编译器坚持像
mov __progname@GOT(%ebx), %eax.