2013-01-16 127 views
1

如果我使用dlopen打開一個動態庫並且我的程序終止而沒有相應的dlclose,引用計數是否會減少?如果不是,會發生什麼?庫會保持加載狀態直到下一次重新啓動?用dlopen加載的共享庫是否自動關閉?

+0

呃。據我所知,「加載庫」隻影響當前程序,所以如果程序終止,庫沒有任何東西可以繼續加載。有點像malloc/free。 – melpomene

+0

@melpomene這就是我所設想的,但我找不到證實這一點的任何文檔。你會認爲它更容易找到,但它在任何地方都沒有提及。 –

+0

共享庫只是一個文件。而已。用dlopen打開的文件與你鏈接的文件沒有區別。在任何動態鏈接的程序上運行strace。 –

回答

2

動態加載器是一個用戶空間代碼(linux/glibc中的ld.so.1)。它被加載到正在運行的程序的用戶空間中,並且不與其他進程交互。所以沒有全球參考指標。

但是,有一種方法可以在進程之間共享動態庫的代碼。動態加載器使用mmap()在進程內存中加載庫代碼。同一個庫的mmap-ed數據將在所有使用它的進程之間共享(直到他們向這些數據頁寫入任何內容,這將使用COW創建它們自己的數據副本)。當你的程序終止時,所有的mmap-ed區域都被釋放。您可能會認爲這是一種參考計數器遞減 - 您的數據頁的副本現在被釋放。