TL;博士鏈接共享庫可執行與另一個共享庫
是否有這樣的Linux負載的任何分歧和鏈接共享庫,如果庫是由可執行文件或通過其他共享庫鏈接?
背景
假設我有包含具有靜態std::map
一個類共享庫(例如libA.so
)和一組單類。每個單身人士課程都可以訪問地圖並靜態地將自己的一個實例添加到地圖中。
有兩種情況:
- 我使用共享庫(
libA.so
)中的可執行文件讀取所有註冊類從全球地圖。 - 我使用共享庫(
libA.so
)在另一個共享庫(libB.so
),並使用在可執行這個新的。在這種情況下,libB.so
使用來自libA.so
的地圖爲可執行文件提供一些功能(如外觀)。
問題
如果使用(即鏈接)此共享庫中的可執行(方案1)中,上述地圖包含單類的列表,然而,如果使用這個庫在另一個共享庫中,然後在可執行文件中使用新文件(場景2),地圖似乎是空的。
我似乎無法理解鏈接器如何處理共享庫,在任何情況下。
更新
事實證明libB.so
不鏈接到正確libA.so
即使使用的g++
-lA
標誌作爲明確指示。雖然我不能看到libA.so
通過libB.so
使用ldd
,pmap
或objdump
聯繫,我使用的libA.so
類時,沒有得到運行時錯誤。如果我運行與clang++
相同的命令,我可以看到所有所需的庫都列出。
在UNIX系統上,共享庫僅爲其代碼頁共享內存。除非您編寫特殊代碼以使庫使用共享內存,否則數據頁仍駐留在使用庫的進程中。我相信Windows有一個DLL將共享數據和代碼的模式。 – jxh
@jxh我在Linux上,但仍然無法理解當我通過另一個共享庫鏈接共享庫時爲什麼會發生所有這些靜態初始化,以及爲什麼它可以正常工作,如果直接通過可執行文件鏈接它? –
當你生成你的第二個庫時,你是否100%確定你是第一個共享庫的靜態鏈接? –