文章目录
- 1. 去除符号表
- 2. dbg信息的作用
- 2.1 静态编译
- 2.2 动态库编译方式
1. 去除符号表
作用:去除符号表可以极大缩小发布的二进制大小(有时候可以缩小一半)
去除手段共两种:
- 直接使用strip命令
- 使用objcopy(更常用)
# 直接使用strip命令
strip xxx.so
# objcopy
# 生成dbg信息
objcopy --only-keep-debug xxx.so xxx.dbg
# 去除符号表
objcopy --strip-debug --strip-unneeded --add-gnu-debuglink=xxx.dbg xxx.so
查看符号表:
# objdump
objdump -t xxx# readelf
readelf -s xxx
2. dbg信息的作用
gdb功能基本上都围绕这符号表展开的,dbg信息主要给gdb使用,缺失dbg信息,对于静态库和动态库的影响程度不一样。
2.1 静态编译
静态库因为在装载的过程中没有重定位符号表的需求。 strip过程中会直接将其所有的符号表
去掉,这个时候可以查看静态编译产生的二进制没有任何符号表。这个时候可以说gdb无法打断点,无法查看调用栈,可以说根本没办法使用。
2.2 动态库编译方式
动态库的重定位发生在加载过程中,这个时候虽然去掉了符号表里面的.debug这个节,但是符号表还在。只是想要使用gdb --tui
这种和c语言可视化调试界面用不了而已,而且大型项目中我们一般也不会使用这种调试方式。所以动态库去掉debug信息,对于gdb大部分功能没有影响(打断点、查调用栈、call函数、查内存地址)