我已經在純C++中創建了一個iOS代碼庫,我打算髮布給很多人。據我所知,在撰寫本文時,在iOS上共享編譯代碼的唯一方法是通過靜態庫。在iOS靜態庫中隱藏C++符號?
不幸的是,在代碼中的一些聰明的位,我想從公衆視線中隱藏其中。我想要做的只是暴露單個(簡單)接口類的符號,並隱藏其他所有內容。這可能嗎?
如何隱藏自己的符號任何其他的想法也非常歡迎。謝謝你的時間!
我已經在純C++中創建了一個iOS代碼庫,我打算髮布給很多人。據我所知,在撰寫本文時,在iOS上共享編譯代碼的唯一方法是通過靜態庫。在iOS靜態庫中隱藏C++符號?
不幸的是,在代碼中的一些聰明的位,我想從公衆視線中隱藏其中。我想要做的只是暴露單個(簡單)接口類的符號,並隱藏其他所有內容。這可能嗎?
如何隱藏自己的符號任何其他的想法也非常歡迎。謝謝你的時間!
解決了!我首先將所有源代碼包含在單個cpp中。其次,我把所有非外部的東西放在一個未命名的名字空間中。然後擺脫剩餘符號的我加入這個腳本生成過程:
echo MyGlobalFunctionToInstantiateMainClass > "${BUILT_PRODUCTS_DIR}/save_symbols"
strip -s "${BUILT_PRODUCTS_DIR}/save_symbols" -u "${BUILT_PRODUCTS_DIR}/lib${PRODUCT_NAME}.a"
它剝離了除MyGlobalFunctionToInstantiateMainClass所有全局符號。
這取決於你認爲是「公共視角」。
如果你的代碼分佈在多個源文件,則在很大程度上是出於運氣,如果你想隱藏鏈接器內部的符號。靜態庫實際上是單個對象文件的存檔,因此在將庫鏈接到應用程序時,它們全都由鏈接器處理。
如果庫很大程度上基於模板,那麼你的運氣也不好。最終程序的編譯器必須能夠看到所有相關的模板,所以你無法隱藏它們。
如果庫包含單個源文件,則可以使用匿名命名空間爲所有內部符號提供這樣一個無法修改的名稱,以使其不可用於所有實際目的。
如果你害怕人們會學到太多的內部符號的名稱,則要麼不使用這種描述性的名稱或建立一個發佈之前運行經過模糊處理的代碼。
我發現,通過將其包括在複合的.cpp,並把一切,但一個公共類爲具名命名空間編譯所有的源文件作爲一個單一的編譯單元隱藏了大部分的符號。
然而,內聯和靜態方法的名字仍出現在靜態庫。有什麼辦法可以防止這種情況發生?
解決重複符號或隱藏的最佳方法是混淆c/C++源代碼。
我們有同樣的問題,解決它,而無需我們所有的代碼合併到一個單一的源文件,看到我寫到這裏的相關問題的答案:https://stackoverflow.com/a/16492468/1086196
謝謝,巴特!這是我懷疑的。如果我可以很好地將它集成到構建過程中,代碼混淆器將起作用。你知道任何好的嗎? – Simplex 2010-11-04 18:53:21