2012-01-09 56 views
5

這裏是問題:在GCC中,如何導出共享庫的所有typeinfo符號而不導出所有符號?

我有一個默認隱藏符號的共享庫。實際上,它使用-Xlinker --version-script =選項來導出特定文件中的某些符號,但隱藏其餘所有符號。問題是,如果我們試圖捕獲在其他共享庫中定義的異常,我們會遇到問題,因爲typeinfo被此共享庫隱藏。我無法明確地使異常類可見,因爲它們是在我無法控制的開源庫中定義的。我也不想在版本腳本符號文件中顯式列出異常類的typeinfo,因爲有許多開發人員在處理這個庫,並且他們一定會忘記爲未來。

我已經嘗試在開源.hpp文件之前使用#pragma GCC可見性推送(默認),但它似乎不工作 - 符號不可見。

我也試過使用-fvisibility-ms-compat,它沒有導出typeinfo符號,但也導出了我不想導出的其他符號的噸。該庫同時具有C和C++代碼,所以我不確定它應該如何處理這個僅適用於C++的選項。

我真正需要的是一個選項,它可以使所有的typeinfo符號可見,而隱藏其他符號(除非它們是明確可見的)。有沒有這樣的選擇?

+0

也許通過處理' nm'或類似的東西?只是一個猜測。 – 2012-01-09 17:45:54

+0

這可能是一個好方法。我曾經想過,雖然我不喜歡額外的腳本工作,但它可能是最好的答案。感謝您的建議! – 2012-01-09 18:06:09

回答

2

您的問題最直接的答案是嘗試ld選項--dynamic-list-cpp-typeinfo。對於這個選項我沒有好運,但是YMMV。

你不說你正在建造哪個平臺。表面上你正在使用mingw,因爲你已經試過-fvisibility-ms-compat;但是如果你實際上在像ELF這樣的ELF目標上,嘗試從你的版本腳本中導出符號通配符_ZTI*_ZTN*。 (你也許可以在Windows上做類似的事情,但是由於Visual C++名稱修改沒有真正記錄,所以我不知道任何可以使用的通配符。)