001 符号表类型
动态链接库是ELF(Executable and Linkable Format)文件的一种,有两个符号表:
符号表类型 | 说明 |
---|---|
.symtab | 包含大量的信息(包括全局符号global symbols) |
.dynsym | 只保留.symtab中的全局符号 |
002 符号表移除
正常情况下编译出的共享库包含了所有的符号信息与调试信息,对于开发和调试会非常方便。但是对于正常的Release版本我们并不需要这些信息,同时这些信息会占用比较大的磁盘空间。
我们可以通过strip工具来实现对共享库部分符号信息的移除
strip xxxx.so
同时我们还可以链接阶段使用ld的-s
和-S
参数,使得连接器生成的输出文件时就不产生符号信息。
-s
和-S
的区别在于-S
移除调试符号信息,而-s
移除所有符号信息。
同时,我们也可以在GCC中通过-Wl,-s
和-Wl,-S
来移除符号信息。
.dynsym
是 .symtab
的子集,命令strip
会去掉ELF文件中.symtab
,但不会去掉.dynsym
。
003 移除符号表的作用
一般来讲,移除符号表之后的共享库会比原来的文件小一半左右,甚至不到一半。