3
我正在使用VS-android框架直接從Microsoft Visual Studio 2012 + Android NDK編譯Android共享對象。 我使用IDA反彙編我自己的.so文件,並且很震驚地看到我所有的代碼都是完全可見的(函數名稱,數據緩衝區名稱,類名稱等)。如何在構建期間從.so文件中刪除符號
我想刪除所有的調試和不需要的符號,所以它很難通過反彙編來理解我的代碼。
編譯過程如下:
- 我有10個C++文件。每個編譯爲.o文件
- main_service.c將編譯爲main.o並與所有其他* .o文件鏈接以生成main_service.so庫。
我曾嘗試以下解決方案,他們沒有工作:
- 給予說法-strip,所有的編譯器和鏈接器。它似乎沒有工作。
- 鏈接後,在main_service.o上使用-strip-all調用objcopy.exe。這減少了main_serivce.so的大小,但符號仍然是
- 在我的C++代碼中,我從來沒有使用「」屬性((visibility()))「所以問題在於鏈接器不能刪除符號,因爲它沒有知道什麼是私人的,可以隱藏什麼是公共的。我嘗試在我想在JNI中使用的main_service.c中添加「」屬性((visibility(「default」)))「,並向編譯器和鏈接器添加了-fvisibility = hidden標誌。但我得到了一個警告:'可見性'屬性被忽略[-Wattributes],並且符號不被刪除
我在這裏丟失了什麼?
P.s. - 如果我的問題有點愚蠢,我完全不熟悉「剝離符號」。
-
嗨,我怎麼能做到這一點與CMake相關。而且,這個命令是否也會減小.so文件的大小? –