【发布时间】:2013-07-30 15:08:53
【问题描述】:
我正在使用 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++ 代码中,我从不使用“attribute ((visibility()))”,所以问题可能是链接器无法删除符号,因为它不知道什么是私有的并且可以隐藏什么是公开的。我尝试将“attribute ((visibility("default")))”添加到我想在 JNI 中使用的 main_service.c 中的函数中,并将 -fvisibility=hidden 标志添加到编译器和链接器。但我收到一个警告:“可见性”属性被忽略 [-Wattributes],符号没有被删除
我在这里错过了什么?
附: - 我对“剥离符号”完全陌生,如果我的问题有点愚蠢,我很抱歉。
-
【问题讨论】:
标签: android shared-libraries debug-symbols ida vs-android