如何在构建期间从.so文件中删除符号

时间:2013-07-30 12:51:14

标签: android shared-libraries debug-symbols ida vs-android

我正在使用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库。
  3. 我尝试了以下解决方案但它们无效:

    1. 将参数-strip-all赋予编译器和链接器。它似乎不起作用。
    2. 链接后,在main_service.o上使用-strip-all调用objcopy.exe。这减少了main_serivce.so的大小,但符号保持
    3. 在我的C ++代码中,我从不使用“属性((visibility()))”因此可能问题是链接器无法删除符号,因为它不知道什么是私有的,可以隐藏什么是公开的。我尝试将“属性((visibility(”default“)))”添加到main_service.c中的函数中,我希望在JNI中使用这些函数,并将-fvisibility = hidden标志添加到编译器和连接。但是我收到了一个警告:“visibility”属性被忽略[-Wattributes],符号未被删除
    4. 我在这里缺少什么?

      P.S。 - 我对“剥离符号”完全不熟悉,如果我的问题有点愚蠢,那就很抱歉。

      -

1 个答案:

答案 0 :(得分:0)

我找到了一种方法。

  1. 我用g ++。exe编译和链接代码(例如 arm-linux-androideabi-g++.exe)。
  2. 对于每个编译文件,我向编译器和链接器提供了以下2个开关-fvisibility=hidden -s。你需要两个开关。
  3. 根本不需要使用__attribute visibility