如何从Android NDK .so文件中删除符号?

时间:2018-05-31 23:56:31

标签: 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

名称已被更改以保护有罪。

2 个答案:

答案 0 :(得分:0)

你可能有BSD nm而不是GNU。试试objdump -TC ......

答案 1 :(得分:0)

由于.so是一个动态加载的共享库,因此需要在外部提供一些符号。要查看这些内容,请使用nm -D libMeow.so。 Strip不会删除这些,否则会使库无法使用。

由于某些函数需要在外部加载,因此您不能只删除所有动态符号,因为之后没有人能够与.so进行交互。如果您的.so是JNI库,则需要在外部看到JNI入口点函数,而如果它是另一个.so链接的共享库,则需要至少具有公共接口您的图书馆可见。

要隐藏内部符号,您可以阅读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: *; };