2013-05-29 65 views

回答

2

不,在系統定義的共享對象中沒有標準的「入口點」。使用dlopen()的給定應用程序可能會定義一個標準符號名稱,以用作此方式加載的模塊的入口點。然後,主機應用程序將使用dlsym()按名稱查找該符號以調用該符號。

但是大多數應用程序根本不直接使用dlopen - 而且你還沒有解釋爲什麼你認爲你應該這樣做。

+0

他們爲什麼不直接使用dlopen? – opc0de

+0

正常應用程序不直接使用它,因爲它們在構建時顯式鏈接到它們所需的共享庫。也就是說,指令被烘焙到每個可執行文件中,告訴加載器加載哪些庫,而不需要應用程序中的任何顯式代碼。您可以通過在可執行文件上運行程序'ldd'來以這種方式自動加載哪些庫。明確使用'dlopen()'是爲實現「插件」體系結構的程序 - 例如程序在運行時不知道它們需要哪些庫。例如:Firefox,Python,Photoshop .... –

2

如果您使用的是GCC或兼容的編譯器,您可以聲明一個函數__attribute__((constructor)),它將在加載時被調用。喜歡的東西

__attribute__((constructor)) 
void init() 
{ 
    puts("Hello dynamic linkage world!"); 
} 
1

從手冊頁: 過時符號_init()和_fini() 鏈接器可識別特殊符號_init和_fini。如果動態庫導出名爲_init()的例程,那麼在dlopen()返回之前,該代碼在加載後執行 。如果動態庫 導出名爲_fini()的例程,那麼在庫卸載之前,該例程僅調用 。如果您需要避免將 鏈接到系統啓動文件,可以使用gcc(1)-nostartfiles命令行選項來完成此操作。

Using these routines, or the gcc -nostartfiles or -nostdlib options, 
    is not recommended. Their use may result in undesired behavior, 
    since the constructor/destructor routines will not be executed 
    (unless special measures are taken). 

    **Instead, libraries should export routines using the 
    __attribute__((constructor)) and __attribute__((destructor)) function 
    attributes. See the gcc info pages for information on these. 
    Constructor routines are executed before dlopen() returns, and 
    destructor routines are executed before dlclose() returns.**