2013-08-07 36 views
3

假設我有一個庫--foo.so。當我構建我的二進制文件(需要這個庫)時,我可以(1)鏈接foo.so,或者,(2)在程序源代碼中,dlopen這個庫,然後調用該庫提供的函數dlopen vs連接開銷

Is there當我從庫中調用函數時,(1)和(2)之間的任何性能差異?請注意,我知道會有不同的初始化特性(如dlopen的開銷,第一次使用符號的開銷等),但在穩定狀態下,兩種選擇都同樣快,還是更快?

謝謝。

回答

2

如果庫是編譯gcc -Wall -fPIC -O2並用gcc -shared鏈接的共享對象(即一些lib*.so文件),則它是一個ELFPosition Independent Code共享庫。

PIC是在32位的x86哪位具有很少的登記冊─比在64位的x86-64哪位有一些尋址模式促進PIC

這是相同的(在穩定狀態)有點更昂貴性能明智,如果它是dlopen -ed或者它是動態鏈接的。因爲在這兩種情況下,真正的鏈接都是由dynamic linker完成的(例如ld-linux.so),正弦libdl.so基本上是動態鏈接器的包裝。

重要的是,當被調用時性能明智的是lib*.so內部的代碼,如果您連接它或不連接它,dlopen也不會改變。

如果圖書館是靜態的鏈接的lib*.a,情況可能會有所不同。你甚至可以編譯和鏈接庫,並與近期GCC編譯的link time optimization能力計劃(編譯和鏈接gcc -flto -Wall -O2

閱讀Drepper的How to Write Shared Library紙和Program Library HowToLevine's Linkers & Loaders書。

+0

但是'dlopen'不是通過指針提供額外的間接層? –

+0

不是w.r.t.一些共享庫(如'libc.so'),它也使用間接方式 –