我有一個用C++編寫的巨大項目。它全部分成多個靜態庫,最終鏈接到一個最終的共享庫,該庫僅導出一些簡單的功能。用C++編寫的共享對象的GCC正確可見性
如果我這樣做是objdump的最後。所以我看到我所有的內部名稱等,因爲它使用長的類名和命名空間這些字符串變得過長,因此最終的二進制大的。
所以,我的問題是我怎麼做正確與海灣合作委員會,以確保所有的內部功能不會在最終的二進制顯示?
我知道所有這些GCC特定的可見性修飾符,我使用-fvisibility = hidden -fvisibility-inlines-hidden,我使用-Wl, - no-whole-archive。我禁用C++異常和rtti(-fno-exceptions -fno-rtti),但我仍然無法讓GCC生成我的最終.so,它不包含我的命名空間和類不應該在那裏的名稱所有!
我試圖用輪候冊, - 版本腳本=控制哪些功能應該是可見的,但我仍然看到內部名稱的大量的最終剝離共享對象。我讀過多個類似的條目,但沒有看到任何工作。 注:我編譯的多平臺(Linux,Windows,iPhone等),只在VS的窗口我沒有任何問題。
感謝
我現在試試這個選項,看看二進制文件是否會運行。從簡單的測試中,我發現來自其他共享庫的導入函數的名稱不再位於二進制文件中。我是否也需要列出導入的名稱? – Pavel
克里斯,這似乎是我需要的選項。最後.so通過幾個megs和nm列表更細,只列出了我輸入到輸出文件中的符號。第一個問題:我使用很多靜態庫,一些導出必須來自這些靜態庫,出於某種原因,這些來自靜態庫的符號不會被導出。爲了解決這個問題,我不得不使用整個歸檔選項來強制從這些庫中導出所有函數。 – Pavel
第二個問題是,即使nm現在只列出了導出文件中的函數,如果我使用objdump,我仍然從我的C++代碼中獲得私有名稱。例如:_ZN20RCSFTServiceImplPeer12onFTProgressERKN3RCS12FileTransferEy我的目標是做任何事情,以便這些字符串不在最終的二進制文件中。 – Pavel