文章目錄
- 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函數、查內存地址)