gpt4 book ai didi

c++ - GCC:在 "Preinitialization"时间执行代码

转载 作者:太空狗 更新时间:2023-10-29 12:36:14 28 4
gpt4 key购买 nike

因此在 Linux 上,当使用 gcc 编译/链接的 C++ 程序加载其可执行文件时,会发生以下情况:

  1. exec* 系统调用
  2. 加载LD动态库
  3. C++静态初始化
  4. 主入口点

假设我有一些原型(prototype)为 void f() 的函数,

是否有某种方式(通过源代码修改、属性、编译器/链接器选项等)将可执行文件与 f 链接,以便它在步骤 1 和步骤 2 之间执行?

第 2 步和第 3 步之间呢?

(显然没有标准的方法来做到这一点,我要求为最新版本的 gcc/linux/x86_64/glibc/binutils 提供一种特定于平台、特定于编译器的方法)

最佳答案

是的,您可以在 (1) 和 (2) 之间或 (2) 和 (3) 之间执行此操作。第 2 步“加载 ld 动态库”实际上是通过调用动态链接器 ld.so 完成的。通常,这将是 /lib64/ld-linux-x86-64.so.2 或类似的;它是 glibc 的一部分。但是,路径实际上是在可执行文件中指定的,因此您可以使用任何您想要的路径。

$ readelf -l `which bash`

Program Headers:

INTERP 0x0000000000000238 0x0000000000400238 0x0000000000400238
0x000000000000001c 0x000000000000001c R 1
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]


这是对 LD_PRELOAD/LD_AUDIT 的补充。

对于 (2) 和 (3) 之间,听起来您只想更改入口点地址。

关于c++ - GCC:在 "Preinitialization"时间执行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10739283/

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