我正在使用 VS-android 框架直接从 Microsoft Visual Studio 2012 + Android NDK 编译 Android 共享对象。我使用 IDA 反汇编了我自己的 .so 文件,并惊恐地发现我的所有代码都是完全可见的(函数的名称、数据缓冲区的名称、类的名称等)。
我想删除所有调试和不需要的符号,因此通过反汇编很难理解我的代码。
编译过程如下:
- 我有 10 个 C++ 文件。每个都被编译成一个 .o 文件
- 然后将 main_service.c 编译为 main.o 并链接到所有其他 *.o 文件以生成 main_service.so 库。
我尝试了以下解决方案,但没有奏效:
- 将参数 -strip-all 提供给编译器和链接器。它似乎不起作用。
- 链接后,在 main_service.o 上使用 -strip-all 调用 objcopy.exe。这会稍微减小 main_serivce.so 的大小,但符号仍然存在
- 在我的 C++ 代码中,我从不使用“属性((visibility()))”,所以问题可能是链接器无法删除符号,因为它不知道什么是私有的,可以隐藏什么是公共的。我尝试将“属性((visibility("default")))”添加到我想在 JNI 中使用的 main_service.c 中的函数,并将 -fvisibility=hidden 标志添加到编译器和链接器。但是我收到了警告:忽略了“可见性”属性 [-Wattributes],并且没有删除符号
我在这里想念什么?
Ps - 我对“剥离符号”完全陌生,如果我的问题有点愚蠢,我很抱歉。
-