2009-10-06 83 views
1

我需要额外的初始化动态链接应用程序中的现有。如何在已编译的应用程序中替换main()?

+0

你想完成什么?我几乎可以向你保证,这是做错的方法。 – 2009-10-06 01:09:35

+0

尝试玩LD_PRELOAD。我现在太累了以至于无法工作,但希望它能解决您的问题。注意Lutz提出的观点。 – 2009-10-06 01:33:25

回答

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(),只需在main()运行前终止(使用exit()等)。请注意,您将无法实际获得main()的地址以手动调用 - 只需从构造函数返回即可继续正常启动。

1

如果你正在编写需要特定的启动初始化共享库,你可以使用GCC“构造”扩展名:

void foo() __attribute__ ((constructor)) 
相关问题