1. 程式人生 > >Linux動態庫(.so)符號表

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。

文章結構: