最近编译libbinder.so发现system/lib/libbinder.so只有358K,但单独编译生成的obj/SHARED_LIBRARIES/libbinder_intermediates/LINKED/libbinder.so有5M多,原因是前者做了strip命令操作。
动态链接库(shared object library)在linux里以.so结尾,是elf(Executable and Linkable Format)文件的一种,有两个符号表:“.symtab”和“.dynsym”。
.symtab:包含大量的信息(包括全局符号global symbols).dynsym:只保留“.symtab”中的全局符号故“.dynsym”可看作“.symtab”的子集。故命令strip会去掉elf文件中“.symtab”,但不会去掉“.dynsym”。
这和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。
具体请参考动态链接库和符号.
Android中编译binder库后生成目录有: system/lib/libbinder.so:只有几百K obj/SHARED_LIBRARIES/libbinder_intermediates/LINKED/libbinder.so:有几M。
文章结构:
动态链接库的符号表为什么要strip如何查看符号表
新闻热点
疑难解答