我需要对动态链接应用程序中的现有内容进行额外的初始化。
答案 0 :(得分:4)
如果要在已编译的程序中运行main()
之前挂钩其他代码,可以使用constructor
属性和LD_PRELOAD
的组合,如下所示:
#include <stdio.h>
void __attribute__((constructor)) init() {
printf("Hello, world!\n");
}
编译并运行:
$ gcc -shared demo_print.c -o demo_print.so -fPIC
$ LD_PRELOAD=$PWD/demo_print.so true
Hello, world!
如果您根本不想运行普通main()
,请在exit()
运行之前终止(使用main()
等)。请注意,您无法实际获取main()
的地址来手动调用 - 只需从构造函数返回以继续正常启动。
答案 1 :(得分:1)
如果您正在编写需要特定启动初始化的共享库,则可以使用GCC“构造函数”扩展:
void foo() __attribute__ ((constructor))