问题标签 [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 回答
524 浏览

c - 为什么动态 ELF 文件中没有 .rel.dyn/.got.plt 部分?

我有这样的代码

我用下面的代码编译它

我想如果跑readelf -S test_printf.so,我会看到.rel.dyn.rel.plt。这是因为这两个部分的行为都类似于静态链接程序中.rel.data的行为。.rel.text

例如,在我的程序中,sinceprintf是一个外部符号,由 my 引用test_printf.so。因此,当我查看test_printf.so的重定位表时,应该有一个条目名称printf。我检查了一下,条目存在。

然后我想,既然printf是外部符号,它的位置应该在运行时确定。.got.plt但是,我们必须为这个函数分配一个节,printf该节应该在动态链接的执行程序和动态库(test_printf.so)中。

但是,当我运行时readelf -S,没有.got.plt部分,我对此感到困惑。动态库(test_printf.so)中是否不需要此部分?我不认为这是可能的。假设test_printf.so最终与执行程序链接a,那么如何a知道.got.plt段在printf哪里呢?这.got.plt最终生成在a?

同时,我有一个问题 2。如果存在.rel.dyn和,是否.rel.plt总是存在?.got.got.plt

0 投票
0 回答
28 浏览

matplotlib - C++ 中的动态链接库

当我在观看他的一部分视频时遇到问题时,我正在关注关于二进制利用的 liveoverflow 课程。在视频中显示了一个链接到调用函数 puts 的库的二进制文件,在视频中显示,在第一次执行该函数之前,GOT 是空的,并且二进制文件无法知道函数所在的位置,当我编译我的 ELF 二进制文件时,我发现在 _start 函数甚至被调用之前,这些地址都填充了 puts 的地址。我真的不明白为什么会发生这样的事情。

0 投票
1 回答
1030 浏览

assembly - `var@GOTPCREL(%rip)` 是什么意思?

是什么<some symbol>@GOTPCREL(%rip)意思?

我遇到了这条线mov var@GOTPCREL(%rip), %rax,对奇怪的语法有点困惑。

有人可以推荐我应该阅读的相关文档来理解这一点吗?谢谢!

0 投票
0 回答
44 浏览

go - 在全局偏移表中找不到函数的动态引用

我制作了一个包含对第三方库的引用的 go 插件。所以我有一个示例函数,如下所示:

CreateEchoObject 的反汇编代码包含:

8b9ab0 存在于 plt.got 表中。

在这里一切都运行良好,但对于我的其他功能之一却没有。

对于上述函数,反汇编代码如下所示:

如您所见,没有类似上述函数的调用。使用 elf 文件解析器,我发现1737f68GOT 中的符号名称 istype.EFOOALAY1736b08is runtime.tlsghttprouter.New我在 plt.got 表中也找不到任何参考。

0 投票
0 回答
65 浏览

linux - GOT/PLT 未用于自定义库函数

在Igor Zhirkov 的《低级编程》一书中,有一个自定义共享库函数(“libfun”)的 got/plt 示例。

请参阅下面的原始 c 代码。

在书中,他表明在反汇编中,对 libfun 的调用转到 got/plt :

但在我的情况下,甚至没有使用 got/plt。我直接跳到 libfun 实现,objdump -D -Mintel-mnemonic main

为什么我没有任何 got/plt 用于 libfun ?

我的动态库创建有问题吗?国旗不见了?

当然,对于 printf 调用,got/plt 可以正常工作。第一次解析 printf 地址(推 0,jmp 到动态链接器...),第二次直接跳转到 printf 地址。

编码 :

主库.c:

dynlib.c:

编译和链接:

编辑 :

使用类似的程序,这次在汇编中,got/plt 按预期工作:

编码 :

主.asm:

lib.asm:

编译:

编辑 2:

回到c程序。这次用“no-pie”编译:gcc -o main -no-pie mainlib.o dynlib.so

现在它起作用了。 gdb main

第二个 libfun 调用(直接跳转到 libfun 实现):

所以,主要问题是:

使用 PIE(即没有 -no-pie),编译器如何知道在第一次调用库函数时在哪里解析它? gcc -o main mainlib.o dynlib.so

0 投票
0 回答
21 浏览

debugging - 符号重定位中的 GOT 与 PLT?

我正在阅读有关链接器,重定位等的信息...

有一个问题我没有找到明确的答案,对于变量的重定位,我们使用 GOT(全局偏移表),但对于函数,我们使用 PLT,它使用 GOT 作为回报。

我的问题是:为什么我们需要 PLT,为什么要添加额外的层,为什么 GOT 不足以满足功能?

0 投票
1 回答
127 浏览

assembly - 了解 GOT(全局偏移表)和 PLT?

在写这个问题之前,我想强调一下,我自己做了几个星期的研究,阅读了数十篇文章,但这个问题仍然没有解决,我得到的解释根本没有意义(可能是因为我是新来的链接世界)。所以我希望有人可以提供简单但非常详细的答案。

我知道 GOT(全局偏移表)可以帮助我们解析动态链接中从另一个引用的全局符号。另外我读到:“每个共享库都有自己的 GOT”

  1. 但这是有问题的,如果 2 个程序使用相同的共享库怎么办?两者都将具有相同的全局变量值,这不应该是这种情况。

  2. 至于我的主要问题:如果我不想使用惰性绑定,那么为什么我们需要 PLT,为什么不直接使用普通的 GOT 作为变量呢?

0 投票
1 回答
34 浏览

linux - 不是函数的全局符号的条目是如何在全局偏移表中初始化的?

所以我正在尝试了解动态链接。在 amd64 上的 SysV ABI 上,可以通过过程链接表延迟加载来自其他共享库的函数,方法是初始化函数的 GOT 条目以指向其 plt 条目中的下一条指令。这最终会将控制权传递给将加载库、更新 GOT 条目并跳转到函数的动态链接器。现在对于其他不是函数的全局符号(没有 PLT 条目),它们将如何或何时初始化?可以偷懒吗?

0 投票
2 回答
84 浏览

c - 可执行文件会通过 GOT 访问共享库的全局变量吗?

我最近在学习动态链接并尝试了一下:

动态的.c

测试.c

编译命令为:

我期待在可执行测试中,主函数将通过 GOT 访问 global_variable。然而,相反,global_variable 放在 test 的数据部分,并在 dynamic.so 中进行异或。所以间接访问 global_variable。

谁能告诉我为什么编译器没有要求测试通过 GOT 访问 global_variable,而是要求共享对象文件这样做?

0 投票
1 回答
41 浏览

javascript - javascript 无法将 undefined 或 null 转换为对象问题

我是第一次尝试 javascript,但我在这个例子中遇到了这个问题:

https://www.twilio.com/blog/web-scraping-and-parsing-html-with-node-js-and-cheerio

这是一个使用 got 和cheerio 的网络爬虫示例,我已经安装了这两个。但是当我运行示例代码时,它给了我“无法将未定义或空值转换为对象错误”。

这是为什么?我根本没有改变示例中的任何内容。

有问题的代码: