Linux动态库(.so)符号表

来源:互联网 发布:安东尼本内特体测数据 编辑:程序博客网 时间:2024/05/21 07:47

       最近编译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。

文章结构:

  • 动态链接库的符号表
  • 为什么要strip
  • 如何查看符号表


0 0
原创粉丝点击