2010-06-02 28 views
6

什麼是基於unix的系統中等效的延遲負載基於unix的系統中的延遲 - 等效負載

我有一個代碼foo.cpp,當使用gcc編譯時,我將它鏈接到共享對象(總共有三個.so文件都在那裏。).so文件中的每個文件都有不同的選項。

-v ./foo需求libversion.so ./foo -update需求libupdate.so

我需要這些庫中的符號應該僅在運行時解析。

./foo -v即使libupdate.so庫不存在也不會中斷。

它使用延遲加載選項(在DLL屬性中)在窗口中工作。它在Unix系統中的等效物是什麼。

在'UNIX'中,'-lazy'選項是否也一樣? 如果是這樣,哪裏可以包含此選項? (在makefile或鏈接器ld中)。

我不擅長unix。 請幫助我..在此先感謝。

+1

我想仍然能聽到的答案在這個問題上,5年以後。 – Lothar 2015-06-23 12:31:06

回答

2

請參閱系統中有關dlopen()的參考資料。您可以在運行時而不是在鏈接時手動打開庫並解析外部符號。

挖出了一個例子:

int main(int argc, char **argv) {     
    void *handle=NULL;         
    double (*myfunc)(double);      
    char *err=NULL;         

    handle = dlopen ("/lib/libm.so.1", RTLD_LAZY); 
    if (!handle) {         
     err=dlerror(); 
     perror(err); 
     exit(1);         
    }            

    myfunc = dlsym(handle, "sin");     
    if ((err = dlerror()) != NULL) {   
     perror(err); 
     exit(1);         
    }            

    printf("sin of 1 is:%f\n", (*myfunc)(1.));    
    dlclose(handle);    
    return 0;     
}             
+1

謝謝。但是如果我可以在鏈接器中指定延遲負載等效選項而不是使用dlopen,那會更好。在GCC中沒有任何選項來延遲加載libxxx.so文件嗎?我們可以不使用gcc -WI來傳遞延遲加載選項來設置延遲加載的鏈接器。鏈接器將默認設置爲延遲加載嗎?請幫助我。預先感謝 – saran 2010-06-03 09:34:32

+1

不,使用dlopen()/ dlsym()是unix上的可移植方式。一些系統的自定義鏈接器可以處理這個(例如:http://docs.sun.com/app/docs/doc/817-1983/6mhm6r4er?l=en&a=view),但是GNU ld沒有這個選項。 – pra 2010-06-03 21:22:32

+0

@pra如果你挖出了一些支持你的陳述的文檔,並將其作爲答案發布,我會贊成它。 – 2015-07-27 20:14:03

0

我知道它已經8年了,但還是......

延遲加載不支持搞出來的GNU系統的方塊,但你可以自己模仿它通過創建一個小的靜態存根,提供所有必要的符號和首次調用(甚至在程序啓動時)的真正實現。這樣子可以手工編寫,通過具體項目的腳本或Implib.so tool產生:

# Replace 
$ gcc -o foo foo.c -lversion 
# with 
$ gen-implib.py libversion.so 
$ gcc -o foo foo.c libversion.tramp.S libversion.init.c