5
如果我在相同的應用程序運行中對同一個lib /文件使用dlopen兩次,它會在這兩種情況下產生相同的句柄嗎?有沒有這方面的保證(一個簡短的實驗表明它至少在我的盒子上)?對於具有相同文件的兩個調用,dlopen會產生相同的句柄嗎?
我目前正在玩一個小插件系統(出於好奇),如果有這種觀察到的行爲會有某種保證,我可以使用此地址作爲插件的關鍵,以防止重複的負載。
如果我在相同的應用程序運行中對同一個lib /文件使用dlopen兩次,它會在這兩種情況下產生相同的句柄嗎?有沒有這方面的保證(一個簡短的實驗表明它至少在我的盒子上)?對於具有相同文件的兩個調用,dlopen會產生相同的句柄嗎?
我目前正在玩一個小插件系統(出於好奇),如果有這種觀察到的行爲會有某種保證,我可以使用此地址作爲插件的關鍵,以防止重複的負載。
是的。該dlopen(3) Linux手冊頁說:
If the same library is loaded again with dlopen(), the same file handle is returned. The dl library maintains reference counts for library handles, so a dynamic library is not deallocated until dlclose() has been called on it as many times as dlopen() has succeeded on it.
BTW,在Linux系統中,你可以dlopen的共享庫的很多(許多幾十千),作爲我的例子manydl.c演示。主要限制是地址空間。 所以幾乎沒有打擾dlclose
-ing的東西是可能的。
(除非你的dlopen-ED共享庫有奇怪的或消耗資源的構造函數和析構函數的函數)
加在2017年12月:
注意的是相關的確切路徑字符串傳遞到dlopen
。因此,如果使用"./foo.so"
和"././foo.so"
(或"../foosymlink.so"
其中foosymlink.so
是符號鏈接foo.so
),則dlopen-ed句柄是不同的,並且在某些情況下,可能會發生該共享庫的兩個實例的奇怪行爲。
..我剛剛閱讀了這個手冊頁,爲什麼我沒有閱讀這個段落呢? Hmpf ..好吧,謝謝你回答我的愚蠢問題:) – mageta