问题标签 [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.
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
matplotlib - C++ 中的动态链接库
当我在观看他的一部分视频时遇到问题时,我正在关注关于二进制利用的 liveoverflow 课程。在视频中显示了一个链接到调用函数 puts 的库的二进制文件,在视频中显示,在第一次执行该函数之前,GOT 是空的,并且二进制文件无法知道函数所在的位置,当我编译我的 ELF 二进制文件时,我发现在 _start 函数甚至被调用之前,这些地址都填充了 puts 的地址。我真的不明白为什么会发生这样的事情。
assembly - `var@GOTPCREL(%rip)` 是什么意思?
是什么<some symbol>@GOTPCREL(%rip)
意思?
我遇到了这条线mov var@GOTPCREL(%rip), %rax
,对奇怪的语法有点困惑。
有人可以推荐我应该阅读的相关文档来理解这一点吗?谢谢!
go - 在全局偏移表中找不到函数的动态引用
我制作了一个包含对第三方库的引用的 go 插件。所以我有一个示例函数,如下所示:
CreateEchoObject 的反汇编代码包含:
8b9ab0 存在于 plt.got 表中。
在这里一切都运行良好,但对于我的其他功能之一却没有。
对于上述函数,反汇编代码如下所示:
如您所见,没有类似上述函数的调用。使用 elf 文件解析器,我发现1737f68
GOT 中的符号名称 istype.EFOOALAY
和1736b08
is runtime.tlsg
。httprouter.New
我在 plt.got 表中也找不到任何参考。
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
:
debugging - 符号重定位中的 GOT 与 PLT?
我正在阅读有关链接器,重定位等的信息...
有一个问题我没有找到明确的答案,对于变量的重定位,我们使用 GOT(全局偏移表),但对于函数,我们使用 PLT,它使用 GOT 作为回报。
我的问题是:为什么我们需要 PLT,为什么要添加额外的层,为什么 GOT 不足以满足功能?
assembly - 了解 GOT(全局偏移表)和 PLT?
在写这个问题之前,我想强调一下,我自己做了几个星期的研究,阅读了数十篇文章,但这个问题仍然没有解决,我得到的解释根本没有意义(可能是因为我是新来的链接世界)。所以我希望有人可以提供简单但非常详细的答案。
我知道 GOT(全局偏移表)可以帮助我们解析动态链接中从另一个引用的全局符号。另外我读到:“每个共享库都有自己的 GOT”
但这是有问题的,如果 2 个程序使用相同的共享库怎么办?两者都将具有相同的全局变量值,这不应该是这种情况。
至于我的主要问题:如果我不想使用惰性绑定,那么为什么我们需要 PLT,为什么不直接使用普通的 GOT 作为变量呢?
linux - 不是函数的全局符号的条目是如何在全局偏移表中初始化的?
所以我正在尝试了解动态链接。在 amd64 上的 SysV ABI 上,可以通过过程链接表延迟加载来自其他共享库的函数,方法是初始化函数的 GOT 条目以指向其 plt 条目中的下一条指令。这最终会将控制权传递给将加载库、更新 GOT 条目并跳转到函数的动态链接器。现在对于其他不是函数的全局符号(没有 PLT 条目),它们将如何或何时初始化?可以偷懒吗?
c - 可执行文件会通过 GOT 访问共享库的全局变量吗?
我最近在学习动态链接并尝试了一下:
动态的.c
测试.c
编译命令为:
我期待在可执行测试中,主函数将通过 GOT 访问 global_variable。然而,相反,global_variable 放在 test 的数据部分,并在 dynamic.so 中进行异或。所以间接访问 global_variable。
谁能告诉我为什么编译器没有要求测试通过 GOT 访问 global_variable,而是要求共享对象文件这样做?
javascript - javascript 无法将 undefined 或 null 转换为对象问题
我是第一次尝试 javascript,但我在这个例子中遇到了这个问题:
https://www.twilio.com/blog/web-scraping-and-parsing-html-with-node-js-and-cheerio
这是一个使用 got 和cheerio 的网络爬虫示例,我已经安装了这两个。但是当我运行示例代码时,它给了我“无法将未定义或空值转换为对象错误”。
这是为什么?我根本没有改变示例中的任何内容。
有问题的代码: