gpt4 book ai didi

android - 如何在构建过程中从 .so 文件中删除符号

转载 作者:太空狗 更新时间:2023-10-29 15:09:43 24 4
gpt4 key购买 nike

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

我在这里错过了什么?

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

-

最佳答案

我找到了一种方法。

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

关于android - 如何在构建过程中从 .so 文件中删除符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17947554/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com