首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从Android .so文件中删除符号?

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

Stack Overflow用户
提问于 2018-05-31 23:56:30
回答 2查看 10.1K关注 0票数 7

如何从Android .so本机代码库中删除符号?

我有一个.so,它有数千个符号,在一个十六进制编辑器中可以清楚地看到。IDA Pro会根据可执行文件中的符号自动反汇编。

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

代码语言:javascript
运行
复制
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

更名是为了保护罪人。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-01 06:27:49

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

由于某些函数需要外部加载,所以不能只删除所有动态符号,因为这样就没有人能够与.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应该如下所示:

代码语言:javascript
运行
复制
{ global:
PublicFunction1;
PublicFunction2;
local: *; };
票数 8
EN

Stack Overflow用户

发布于 2018-06-01 02:26:41

您可能有BSD nm,而不是GNU的。试试objdump -TC ......

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50634353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档