3

我正在使用 VS-android 框架直接从 Microsoft Visual Studio 2012 + Android NDK 编译 Android 共享对象。我使用 IDA 反汇编了我自己的 .so 文件,并惊恐地发现我的所有代码都是完全可见的(函数的名称、数据缓冲区的名称、类的名称等)。

我想删除所有调试和不需要的符号,因此通过反汇编很难理解我的代码。

编译过程如下:

  1. 我有 10 个 C++ 文件。每个都被编译成一个 .o 文件
  2. 然后将 main_service.c 编译为 main.o 并链接到所有其他 *.o 文件以生成 main_service.so 库。

我尝试了以下解决方案,但没有奏效:

  1. 将参数 -strip-all 提供给编译器和链接器。它似乎不起作用。
  2. 链接后,在 main_service.o 上使用 -strip-all 调用 objcopy.exe。这会稍微减小 main_serivce.so 的大小,但符号仍然存在
  3. 在我的 C++ 代码中,我从不使用“属性((visibility()))”,所以问题可能是链接器无法删除符号,因为它不知道什么是私有的,可以隐藏什么是公共的。我尝试将“属性((visibility("default")))”添加到我想在 JNI 中使用的 main_service.c 中的函数,并将 -fvisibility=hidden 标志添加到编译器和链接器。但是我收到了警告:忽略了“可见性”属性 [-Wattributes],并且没有删除符号

我在这里想念什么?

Ps - 我对“剥离符号”完全陌生,如果我的问题有点愚蠢,我很抱歉。

-

4

1 回答 1

0

我找到了一种方法来做到这一点。

  1. 我用 g++.exe 编译并链接了代码(例如 arm-linux-androideabi-g++.exe)。
  2. -fvisibility=hidden -s对于每个编译的文件,我为编译器和链接器提供了以下 2 个开关。你需要两个开关。
  3. 完全不需要使用__attribute visibility
于 2013-08-05T14:06:46.790 回答