2010-05-07 76 views
5

我有一個C++程序,它可以在運行時與mylib.so鏈接。那麼,同一個程序使用dlopen()/ dlsym()從myplugin.so加載一個函數,該函數依次對mylib.so具有依賴關係。是運行時鏈接庫的全局變量在用dlopen加載的插件之間共享的嗎?

我的問題是:程序和插件中的函數是否會訪問與mydlib.so中定義的相同的全局變量,這些全局變量是爲程序保留的同一個內存區域,或者每個變量都會在其內存空間中分配不同的,無關的副本?如果後者是默認行爲,是否有可能改變這種情況?

在此先感謝=)!

回答

1

執行dlopen的主程序中的全局變量應該對動態加載的代碼可見。然而,迄今爲止我所見過的最好的建議(特別是如果你想要甚至含有模糊的可移植代碼)只能通過鏈接器劃分傳遞函數調用,並且不能在任何方向上導出任何變量。最好是如果有一個API用於加載的代碼用裝載器註冊API的有趣部分(例如,「這是我如何提供這個SPI用於在baz上繪製foobar」),因爲這是一種更加安全的方式回調而不是將所有東西混合在一起。

[編輯]:這樣做的另一個原因是,如果你在一個不支持它的平臺上模擬弱鏈接。這與我列出的另一個很相似,只不過它是主動程序,它是從動態庫導出的API中構建SPI的,而不是在啓動時明確導出它的.so。這確實是第二好的,但是你用自己的想法做了而不是希望(當然,除非你準備通過編寫某種連接庫來完成這項工作)。

+0

+1使用乾淨的API/SPI – neuro 2010-05-07 16:35:37

相關問題