问题标签 [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.
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 条目符号和地址的。
x86 - 每个 .so 文件都有 PLT/GOT 吗?
我一直在考虑这个问题,因为我观察到即使是像 libc 这样的非常基础的库也有一个 GOT/PLT,它由 malloc() 和它的朋友等重要功能组成。
甚至可以创建一个没有 GOT/PLT 的共享库吗?在学术活动之外,这样的图书馆会在野外出现吗?(如果有帮助,请仅考虑 x86 平台)
我的直觉告诉我,这些问题的答案分别是“否”和“是”,但我都不是 100% 确定的。
仅包含 C 类型列表的 .so 文件是否可能没有 GOT/PLT?也许吧,但我不明白为什么当你可以#include一个.h文件来做到这一点时,为什么会在实践中发生这种情况!
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 步的目的是什么?
我对这个话题的理解是粗略的,所以请指出任何可以帮助这个问题的澄清。
linux - GOT[0](全局偏移表)在哪里使用?
我知道“GOT[1] 指向 Link_map 结构”,“GOT[2] 指向 _dl_runtime_resolver_”。但我找不到使用 GOT[0] 的地方。
有人知道 GOT[0] 在哪里使用吗?
x86 - 什么是 ELF 中的 <.got> 部分?
据我所知,PLT
是GOT
处理动态链接函数的部分。
如果代码调用printf
了libc的函数,
1.首先调用PLT
获取printf
地址。
2. 并将此地址写入GOT
段。
3. 从第二次调用开始,代码使用GOT
.
当我仔细查看 ELF 二进制文件时,
- 我发现 ELF 中 sectionPLT
的名称是<.plt>
.
- GOT
ELF 中的部分名称是<.got.plt>
.
但是...... ELF中也有<.got>
部分。
我无法理解这部分是如何使用的。
Q.<.got>
部分的用途是什么?和部分
有什么区别?<.got>
<.got.plt>
PS 1. 这个<.got>
部分非常小,(在我的示例二进制文件中它只包含 4 个字节。)
在这里我附上<.got>
部分的 IDA 视图:
PS2。我也检查了here,但答案不足以让我理解 <.got> 部分的用法。
assembly - 为什么某些链接器制作的汇编代码位于 GOT 而不是 PLT?
链接后一些库函数如下所示。
所以,我了解了@plt
反汇编的用法。
然而,昨天,我有些奇怪的代码切片。
以下是 的一部分libstdbuf.s
,包含在Coreutils
:
如您所见,代码访问stdin@GOT
.
嗯...我以前从未见过blabla@GOT
语法..
问题:
线路具体是做什么
stdin@GOT(%ebx), %eax
的?这是链接器生成的代码吗?如果是,为什么是在
GOT
,而不是PLT
?- 还有..我怎么知道
stdin@GOT
地址信息?
(与一般的全局符号不同,地址未显示在符号表上。见下文)
.
linux - 我可以通过“GOT 地址”获取符号名称吗?
现在我正在开发程序,比如readelf
使用pyelftools
库。
我想打印如下表。
在这里,Offset
字段是stderr@GOT
地址。
假设我只有00001c50
未知符号的 GOT 地址()。
我的情况是我想get_symname_by_GOTaddress
从00001c50
tostderr@GLIBC_2.0
。
问题:但是,我找不到二进制之间的GOT address
任何symbol name
我怎么才能得到它?
assembly - GAS Intel 语法中的 GOTPCREL(%rip)
我如何编写以下内容:movq variable@GOTPCREL(%rip), %r8
在 GAS Intel 语法中?
.intel_syntax noprefix
只允许这样:mov r8, variable@GOTPCREL
,它不理解()
,并且生成的代码不同-我收到分段错误。如何指定 RIP 相对寻址?
此时我必须使用以下语法切换器:
我更喜欢 Intel 语法,我的代码主要使用它。在将代码移植到 GAS 时,此切换器很不方便。是否可以用 Intel 语法快速编写它?
unix - 两个进程如何共享同一个共享库?
我一直在尝试更好地了解共享库的工作原理,但我无法解决两件事。
1-每个进程都有自己的虚拟内存空间和页表,所以如果一个共享库被加载到一个进程的虚拟内存空间中,那么第二个进程如何访问该共享库,因为它不在其内存空间中?
2-我知道只有文本部分被共享而全局数据不被共享,这怎么可能?我的理解是,对全局变量的每个引用都是通过全局偏移表(简称 GOT)完成的。所以,如果我有这行代码,x = glob
那么这将大致等于mov eax,DWORD PTR [ecx-0x10]
汇编中ecx
的内容,其中用作 GOT 的基值。但如果是这种情况,那么很明显,无论哪个进程调用该行,它总是会访问同一个全局变量,其地址位于 GOT 中的偏移量 0x10。那么,如果两个进程使用引用相同 GOT 条目的相同文本部分,那么它们如何拥有不同的全局变量副本呢?
linux - 为什么 pie 二进制文件中不允许使用“symbol@GOT”?
这是示例程序集文件,test.s
我尝试用-pie
标志编译它,但失败了。
错误说,在 pie 二进制文件中,GOT
只能使用基址寄存器访问条目。
问题。
我不知道为什么编译器会像上面那样抱怨。
更具体地说,为什么__progname@GOT
pie 二进制文件不允许寻址?
我的意见。
Loader 知道__progname@GOT
pie 二进制文件在加载时的地址。
__progname@GOT
因此,加载程序可以简单地在加载时间的位置写入这个地址。
这就是装载机可以做的。
所以我不明白为什么编译器坚持像
mov __progname@GOT(%ebx), %eax
.