2012-10-17 71 views
2

如果在此論壇中重複此問題,我很抱歉。我有一個問題,在Mac上加載和卸載dylibs不能按預期工作(尤其是卸載部分)。 問題是如果我有一個可執行文件,並且如果我加載共享庫說A.dylib,然後使用加載的共享庫加載庫說B.dylib。當我嘗試在稍後階段卸載庫B.dylib時,沒有返回錯誤代碼(返回int值爲0--因爲我使用常規的dlopen和dlclose函數來裝載和卸載庫,0表示卸載成功) ,但是當我檢查確保使用活動監視器或lsof時,b.dylib仍在內存中。在Mac OSX中加載和卸載共享庫

現在我們正在將此代碼移植到windows,linux & mac。 Windows和Linux按預期工作,但只有Mac給我帶來問題。

我正在閱讀mac開發者庫,發現:「有幾種情況下動態庫永遠不會被卸載: 1)主要的可執行鏈接違背它,2)一個API不是supoort卸載(例如NSAddImage()) 用於加載它或其他依賴它的動態庫,3)動態庫在 dyld的共享緩存中。「

在我的情況下,我不會跌倒前兩種情況之一。我懷疑case3。
這是我的問題: 1.我能做些什麼來確保我有案例3? 2.如果是,如何解決? 3.如果沒有,如何解決它? 4.爲什麼mac如此不同?

在這方面的任何幫助表示讚賞!

感謝, 揚

回答

4

當加載共享庫到可執行文件,所有由該庫導出的符號的考生,以解決由可執行所需的符號,造成庫如果dyld的連接器保持裝載綁定到一個無意的符號。您可以使用nm列出共享庫中的符號,並且可以設置環境變量以啓用動態鏈接程序的調試輸出(請參閱dyld上的手冊頁)。您需要設置DYLD_PRINT_BINDINGS環境變量。

最有可能的是,您需要將導出的符號限制爲可執行文件使用的特定子集,以便只限制您打算使用的符號。這可以通過將所需符號放置在文件中並通過-exported_symbols_list選項將其傳遞給鏈接器來完成。如果不這樣做,您可以最終在dyloaded庫中綁定一個符號,並且它不會被卸載,因爲它們需要解析可執行文件中的符號,並且在調用dlclose()時不會卸載。

+0

不錯的一個。 gotcha ...感謝您的幫助 – jan