android - 如何从 Android NDK .so 文件中去除符号?

标签 android android-ndk debug-symbols

如何从 Android .so 原生代码库中剥离符号?

我构建了一个 .so,它有数千个符号在十六进制编辑器中清晰可见。 IDA Pro 会根据可执行文件中的符号使用适当的符号自动反汇编。

但是,如果我要求 nm 转储符号表,它会说没有。 stripobjcopy 也没有效果。

C:\AndroidProject.apk\lib\armeabi-v7a>arm-linux-androideabi-strings.exe libMeow.so | findstr _ZN11SecretClass14SecretFunctionERKS_
_ZN11SecretClass14SecretFunctionERKS_

C:\AndroidProject.apk\lib\armeabi-v7a>arm-linux-androideabi-nm.exe libMeow.so
arm-linux-androideabi-nm.exe: libMeow.so: no symbols

C:\AndroidProject.apk\lib\armeabi-v7a>copy /y libMeow.so libMeow-test.so
        1 file(s) copied.

C:\AndroidProject.apk\lib\armeabi-v7a>sha1sum libMeow.so libMeow-test.so
0a36701ba44b4cfb31e6f6506349493d5466cd70 *libMeow.so
0a36701ba44b4cfb31e6f6506349493d5466cd70 *libMeow-test.so

C:\AndroidProject.apk\lib\armeabi-v7a>arm-linux-androideabi-strip.exe libMeow-test.so

C:\AndroidProject.apk\lib\armeabi-v7a>sha1sum libMeow.so libMeow-test.so
0a36701ba44b4cfb31e6f6506349493d5466cd70 *libMeow.so
0a36701ba44b4cfb31e6f6506349493d5466cd70 *libMeow-test.so

C:\AndroidProject.apk\lib\armeabi-v7a>arm-linux-androideabi-strip.exe -g libMeow-test.so

C:\AndroidProject.apk\lib\armeabi-v7a>sha1sum libMeow.so libMeow-test.so
0a36701ba44b4cfb31e6f6506349493d5466cd70 *libMeow.so
0a36701ba44b4cfb31e6f6506349493d5466cd70 *libMeow-test.so

名称已更改以保护罪犯。

最佳答案

由于 .so 是一个动态加载的共享库,它需要有一定数量的外部可用符号。要查看这些,请使用 nm -D libMeow.so。 Strip 不会删除这些,否则会使库无法使用。

由于一些函数需要从外部加载,你不能只删除所有动态符号,因为这样就没有人能够与.so 交互。如果你的 .so 是一个 JNI 库,你需要让 JNI 入口点函数在外部可见,而如果它是另一个 .so 链接的共享库,你至少需要让您的图书馆的公共(public)界面可见。

要隐藏内部符号,可以阅读https://gcc.gnu.org/wiki/Visibility完整的故事。大致而言,您的选择是:

  • 对您不希望在库外可见的每个符号使用 __attribute__ ((visibility ("hidden")))。 (这可能有很多,追踪每一个都需要大量工作。)
  • 使用 -fvisibility=hidden 进行构建,这会在每个外部符号上隐式设置它,并在其中添加 __attribute__ ((visibility ("default")))您实际上需要导出的(可能少得多)
  • 使用“版本脚本”来限制导出到选择列表的功能。链接时,传递-Wl,-version-script -Wl,mylib.ver

对于版本脚本的情况,mylib.ver应该是这样的:

{ global:
PublicFunction1;
PublicFunction2;
local: *; };

关于android - 如何从 Android NDK .so 文件中去除符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50634353/

相关文章:

android - Honeycomb 的新小部件的文档在哪里?

android - 具有 singleInstance launchMode 和新线程的 Activity

java - 未使用的变量和方法会增加应用程序的大小吗?

android-ndk - 是否可以使用带有 cgo 和/或 SWIG 或类似工具的 NDK 在 Go 中构建 Android 游戏?

visual-studio-2010 - 如何调试 VSPackage 项目

visual-studio - 摆脱 "There is no source code available for the current location."

android - 在 TeamCity 中运行 android studio 项目的单元测试

android - Android SDK 和 NDK 有什么区别?

java - 使用 .so 文件构建 Ant

compiler-construction - 获取LLVM值的原始变量名