gpt4 book ai didi

assembly - 关于 X86-64 的 glibc 启动代码的问题

转载 作者:行者123 更新时间:2023-12-05 03:28:06 24 4
gpt4 key购买 nike

我正在查看 Glibc 中 x86-64 的启动代码,我很好奇我在屏幕截图中直接突出显示的以下两个地方。

代码:https://github.com/bminor/glibc/blob/master/sysdeps/x86_64/start.S

  1. 为什么我们需要在堆栈上存储所谓的“垃圾”?
  2. 为什么我们只是简单地重置寄存器 r8 和 rcx 而不是将 .init 和 .fini 的函数指针传递给它们?

enter image description here

最佳答案

pushq %rax 需要堆栈对齐:RSP % 16 == 0 在任何 call 指令之前。

在当前的 ELF 版本中,ELF 的构造函数和析构函数可以通过 dynamic tags 来识别。 (DT_INIT_ARRAYDT_FINI_ARRAY 通常是首选,因为改进了展开支持)。在 2.34 版本之前的 glibc 中,静态链接的启动代码(引用的汇编程序片段是其中的一部分)实际上有自己的循环来处理 DT_INIT_ARRAY。在 glibc 2.34 中,这段代码被删除了,因为结果是 it contained a very generic jump-oriented programming (JOP) gadget .

.init 函数指针仍然作为零传递,因为这允许为旧二进制文件和新二进制文件共享 __libc_start_main(进一步向下调用)的实现。 glibc 版本 2.34 及更高版本查看此函数指针并在非空时调用它,否则使用 DT_INITDT_INIT_ARRAY 查找要调用的函数。

以这种方式更改 .init 的另一个原因是有必要 change the startup code on all 21 glibc architectures ,并且将参数更改为零比将其删除更容易,因为它不会影响函数签名或调用约定。

几乎相同的原理适用于 .fini 更改,除了在这种情况下,旧的动态链接的 __libc_start_main 实现已经忽略了它。

关于assembly - 关于 X86-64 的 glibc 启动代码的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71298014/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com