2009-10-06 84 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)) 
相關問題