动态链接库优化---清除符号表信息

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 移除符号表的作用

一般来讲,移除符号表之后的共享库会比原来的文件小一半左右,甚至不到一半。

推荐阅读更多精彩内容