001 符號(hào)表類型
動(dòng)態(tài)鏈接庫是ELF(Executable and Linkable Format)文件的一種,有兩個(gè)符號(hào)表:
| 符號(hào)表類型 | 說明 |
|---|---|
| .symtab | 包含大量的信息(包括全局符號(hào)global symbols) |
| .dynsym | 只保留.symtab中的全局符號(hào) |
002 符號(hào)表移除
正常情況下編譯出的共享庫包含了所有的符號(hào)信息與調(diào)試信息,對(duì)于開發(fā)和調(diào)試會(huì)非常方便。但是對(duì)于正常的Release版本我們并不需要這些信息,同時(shí)這些信息會(huì)占用比較大的磁盤空間。
我們可以通過strip工具來實(shí)現(xiàn)對(duì)共享庫部分符號(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中通過-Wl,-s和-Wl,-S來移除符號(hào)信息。
.dynsym 是 .symtab的子集,命令strip會(huì)去掉ELF文件中.symtab,但不會(huì)去掉.dynsym。
003 移除符號(hào)表的作用
一般來講,移除符號(hào)表之后的共享庫會(huì)比原來的文件小一半左右,甚至不到一半。