2013-07-30 40 views
3

我正在使用VS-android框架直接從Microsoft Visual Studio 2012 + Android NDK編譯Android共享對象。 我使用IDA反彙編我自己的.so文件,並且很震驚地看到我所有的代碼都是完全可見的(函數名稱,數據緩衝區名稱,類名稱等)。如何在構建期間從.so文件中刪除符號

我想刪除所有的調試和不需要的符號,所以它很難通過反彙編來理解我的代碼。

編譯過程如下:

  1. 我有10個C++文件。每個編譯爲.o文件
  2. main_service.c將編譯爲main.o並與所有其他* .o文件鏈接以生成main_service.so庫。

我曾嘗試以下解決方案,他們沒有工作:

  1. 給予說法-strip,所有的編譯器和鏈接器。它似乎沒有工作。
  2. 鏈接後,在main_service.o上使用-strip-all調用objcopy.exe。這減少了main_serivce.so的大小,但符號仍然是
  3. 在我的C++代碼中,我從來沒有使用「」屬性((visibility()))「所以問題在於鏈接器不能刪除符號,因爲它沒有知道什麼是私人的,可以隱藏什麼是公共的。我嘗試在我想在JNI中使用的main_service.c中添加「」屬性((visibility(「default」)))「,並向編譯器和鏈接器添加了-fvisibility = hidden標誌。但我得到了一個警告:'可見性'屬性被忽略[-Wattributes],並且符號不被刪除

我在這裏丟失了什麼?

P.s. - 如果我的問題有點愚蠢,我完全不熟悉「剝離符號」。

-

回答

0

我找到了一種方法來做到這一點。

  1. 我編譯和克++鏈接的代碼。exe文件(例如 arm-linux-androideabi-g++.exe)。
  2. 對於每個編譯的文件,我給了編譯器和鏈接器兩個開關-fvisibility=hidden -s。你需要兩個開關。
  3. 完全不需要使用__attribute visibility
+0

嗨,我怎麼能做到這一點與CMake相關。而且,這個命令是否也會減小.so文件的大小? –

相關問題