2012-05-02 86 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