001 符號(hào)表類型
動(dòng)態(tài)鏈接庫(kù)是ELF(Executable and Linkable Format)文件的一種,有兩個(gè)符號(hào)表:
符號(hào)表類型 | 說(shuō)明 |
---|---|
.symtab | 包含大量的信息(包括全局符號(hào)global symbols) |
.dynsym | 只保留.symtab中的全局符號(hào) |
002 符號(hào)表移除
正常情況下編譯出的共享庫(kù)包含了所有的符號(hào)信息與調(diào)試信息棋傍,對(duì)于開(kāi)發(fā)和調(diào)試會(huì)非常方便赁还。但是對(duì)于正常的Release版本我們并不需要這些信息燎窘,同時(shí)這些信息會(huì)占用比較大的磁盤(pán)空間众弓。
我們可以通過(guò)strip工具來(lái)實(shí)現(xiàn)對(duì)共享庫(kù)部分符號(hào)信息的移除
strip xxxx.so
同時(shí)我們還可以鏈接階段使用ld的-s
和-S
參數(shù),使得連接器生成的輸出文件時(shí)就不產(chǎn)生符號(hào)信息。
-s
和-S
的區(qū)別在于-S
移除調(diào)試符號(hào)信息原献,而-s
移除所有符號(hào)信息。
同時(shí)埂淮,我們也可以在GCC中通過(guò)-Wl,-s
和-Wl,-S
來(lái)移除符號(hào)信息姑隅。
.dynsym
是 .symtab
的子集,命令strip
會(huì)去掉ELF文件中.symtab
,但不會(huì)去掉.dynsym
倔撞。
003 移除符號(hào)表的作用
一般來(lái)講讲仰,移除符號(hào)表之后的共享庫(kù)會(huì)比原來(lái)的文件小一半左右,甚至不到一半痪蝇。