我如何在已编译的应用程序中替换main()?

时间:2009-10-06 01:08:01

标签: linux dynamic

我需要对动态链接应用程序中的现有内容进行额外的初始化。

2 个答案:

答案 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))