【问题标题】:How to remove symbols from .so file during build如何在构建期间从 .so 文件中删除符号
【发布时间】:2013-07-30 15:08:53
【问题描述】:

我正在使用 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++ 代码中,我从不使用“attribute ((visibility()))”,所以问题可能是链接器无法删除符号,因为它不知道什么是私有的并且可以隐藏什么是公开的。我尝试将“attribute ((visibility("default")))”添加到我想在 JNI 中使用的 main_service.c 中的函数中,并将 -fvisibility=hidden 标志添加到编译器和链接器。但我收到一个警告:“可见性”属性被忽略 [-Wattributes],符号没有被删除

我在这里错过了什么?

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

-

【问题讨论】:

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


    【解决方案1】:

    我找到了一种方法。

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

    【讨论】:

    • 嗨,我怎么能对涉及的 CMake 做同样的事情。而且,这个命令是否也会减小 .so 文件的大小?
    猜你喜欢
    • 1970-01-01
    • 2018-11-11
    • 2018-05-26
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    相关资源
    最近更新 更多