首页 > 学院 > 开发设计 > 正文

Linux动态库(.so)符号表

2019-11-08 00:24:48
字体:
来源:转载
供稿:网友

       最近编译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如何查看符号表



发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表