最近編譯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如何查看符號表
新聞熱點
疑難解答