【发布时间】:2012-05-31 03:25:51
【问题描述】:
因此,在 Linux 上,当使用 gcc 编译/链接的 C++ 程序加载其可执行文件时,会发生以下情况:
- exec* 系统调用
- 已加载 LD 动态库
- C++ 静态初始化
- main 的入口点
假设我有一些原型函数void f(),
是否有某种方式(通过源代码修改、属性、编译器/链接器选项等)将可执行文件与 f 链接起来,以便在第 1 步和第 2 步之间执行?
第 2 步和第 3 步之间呢?
(显然没有标准的方法可以做到这一点,我要求为最新版本的 gcc/linux/x86_64/glibc/binutils 提供平台特定、编译器特定的方式)
【问题讨论】:
-
第 1 步和第 2 步之间?所以你想在图像准备好运行之前运行一些代码?
-
不太可能。你还需要它做什么?
-
加载动态库时,是不是有一些机制可以让它们执行一些代码?我想在此之前执行 f。
-
void __attribute__ ((constructor)) my_init(void);(来自tldp.org/HOWTO/Program-Library-HOWTO/miscellaneous.html) -
是的,所以这些库构造函数将在“步骤 2”期间执行。