2012-05-02 36 views
1

我编写了我的LD_PRELOAD模块,我想在我的覆盖函数工作之前添加一些初始化代码。也许LD_PRELOAD有任何加载的事件或类似的东西?LD_PRELOAD加载的事件

谢谢!

回答

3

我不确定“已加载”事件,但是如果您使用的是gcc,则可能会发现constructor属性有用。举个例子:

testlib.c: 的#include

void testing(void) __attribute__((constructor)); 

void testing(void) 
{ 
    printf("It worked!\n"); 
} 

hworld.c

#include <stdio.h> 

int main(void) 
{ 
    printf("Hello world!\n"); 
    return 0; 
} 

$ gcc -o hworld hworld.c 
$ gcc -shared -fPIC -o testlib.so testlib.c 
$ export LD_PRELOAD=./testlib.so 
$ ./hworld 
It worked! 
Hello world! 

constructor属性意味着该函数应该main()之前执行。或者,如果您使用的是C++,则可以创建一个类的静态全局实例,该实例的构造函数进行初始化,这将实现与使用constructor相同的效果。

+0

谢谢!但我注意到这个构造函数多次调用了一次,你能帮助如何修复它吗?谢谢! – user1262425

+0

@ user1262425你可以更新一个你看到它不止一次被调用的例子吗? Afaik应该只在'main()'运行之前调用一次。 – FatalError