Linux动态库(.so)符号表

       最近编译libbinder.so发现system/lib/libbinder.so只有358K,但单独编译生成的obj/SHARED_LIBRARIES/libbinder_intermediates/LINKED/libbinder.so有5M多,原因是前者做了strip命令操作。

1.动态链接库的符号表

  动态链接库(shared object library)在linux里以.so结尾,是elf(Executable and Linkable Format)文件的一种,有两个符号表:“.symtab”和“.dynsym”。

.symtab:
包含大量的信息(包括全局符号global symbols)
.dynsym:
只保留“.symtab”中的全局符号

故“.dynsym”可看作“.symtab”的子集。故命令strip会去掉elf文件中“.symtab”,但不会去掉“.dynsym”。

2.为什么要strip?

  这和ELF有关,ELF文件包含allocable/non-allocable ELF section。

allocable:
ELF包含一些sections(如code/data)是在运行时需要的,这些section被称为allocable。
non-allocable:
其他一些sections仅仅是linker/debuger等工具需要但运行时不需要,被称为non-allocable。

当Linker构建ELF文件时,把allocable/non-allocable分开存放,当OS加载ELF时,仅仅allocable数据被映射到内存,non-allocable的数据仍静静地呆在文件中不被处理。所以strip命令的作用就是移除non-allocable sections。

具体请参考动态链接库和符号.

3.如何查看符号表?

未被strip的so库:
执行nm libbinder.so即可(默认查看.symtab符号表)。
被strip的so库:
由于.symtab符号表被移出,需要加上-D参数,如nm -Do libbinder.so。否则使用nm时提示no symbol。

Android中编译binder库后生成目录有:
system/lib/libbinder.so:只有几百K
obj/SHARED_LIBRARIES/libbinder_intermediates/LINKED/libbinder.so:有几M。

文章结构:


  • 11
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值