1.命令簡介
strip 命令是 GNU Binutils 中的一員,用于剝掉目標(biāo)文件中一些符號信息和調(diào)試信息,使文件變小。
2.命令格式
3.選項(xiàng)說明
[-F bfdname |--target=bfdname]:使用指定的二進(jìn)制文件格式(Binary Format Descriptor)解析輸入的目標(biāo)文件,輸出目標(biāo)文件時也采用相同的格式
[-I bfdname |--input-target=bfdname]:使用指定的二進(jìn)制文件格式(Binary Format Descriptor)解析輸入的目標(biāo)文件
[-O bfdname |--output-target=bfdname]:使用指定的二進(jìn)制文件格式(Binary Format Descriptor)輸出目標(biāo)文件
[-s|--strip-all]:刪除所有符號
[-S|-g|-d|--strip-debug]:僅刪除調(diào)試符號
[--strip-dwo]:刪除所有DWARF .dwo節(jié)的內(nèi)容,保留其余調(diào)試節(jié)和所有符號不變
[-K symbolname |--keep-symbol=symbolname]:保留源文件中指定的符號symbolname
[-N symbolname |--strip-symbol=symbolname]:從源文件中刪除符號symbolname。此選項(xiàng)可能不止一次
[-w|--wildcard]:允許在其他命令行選項(xiàng)中對符號名稱使用正則表達(dá)式。問號(?)、星號(*)、反斜杠()和方括號([])運(yùn)算符可以在符號名的任何位置使用
[-x|--discard-all]:刪除非全局符號
[-X |--discard-locals]:刪除編譯器生成的本地符號
[-R sectionname |--remove-section=sectionname]:從輸出文件中刪除名為sectionname的任何節(jié)。此選項(xiàng)可能會給出多次。請注意,不適當(dāng)?shù)厥褂么诉x項(xiàng)可能會使輸出文件不可用。通配符*可以在sectionname的末尾給出。如果是這樣,則將刪除以sectionname開頭的任何節(jié)
[-o file]:將剝離的輸出放入文件 file 中,而不是替換現(xiàn)有文件。使用此參數(shù)時,只能指定一個objfile
[-p|--preserve-dates]:保留文件的訪問和修改日期
[-D|--enable-deterministic-archives]:以確定性模式(deterministic mode)操作。復(fù)制存檔成員和寫入存檔索引時,對UIDs、GIDs、時間戳使用零,對所有文件使用一致的文件模式
[-U|--disable-deterministic-archives]:不以確定性模式(deterministic mode)操作。這與上面的-D選項(xiàng)相反:復(fù)制存檔成員并寫入存檔索引時,使用它們的實(shí)際UID、GID、時間戳和文件模式值
[--keep-file-symbols]:保留符號信息
[--only-keep-debug]:保留調(diào)試信息
[-v |--verbose]:詳細(xì)輸出:列出所有修改的對象文件。對于歸檔文件,strip-v 列出了歸檔文件的所有成員
[-V|--version]:顯示版本信息
[-h|--help]:顯示幫助信息
[--info]:列出支持的目標(biāo)文件格式和架構(gòu)
objfile...:目標(biāo)文件,包括庫文件或可執(zhí)行文件
4.常用示例
先看一個 C++ 源碼文件 main.cpp。
//
//@file:main.cpp
//
#include
intmain()
{
std::cout<<"strip"<
使用 g++ 編譯生成可執(zhí)行文件 main.out。
g++-omain.outmain.cpp
ll
-rw-r--r--1rootroot68Mar2215:55main.cpp
-rwxr-xr-x1rootroot9119Mar2215:55main.out
(1)剝掉可執(zhí)行文件中一些符號信息和調(diào)試信息,使文件變小。
首先使用file命令來查看可執(zhí)行文件main.out的基本信息,可見其是not stripped。
filemain.out
main.out:ELF64-bitLSBexecutable,x86-64,version1(SYSV),dynamicallylinked(usessharedlibs),forGNU/Linux2.6.32,BuildID[sha1]=9d0d7d3718cf9a4cfdc3e026de804e2428bb60fa,notstripped
然后使用 nm 命令來查看 main.out 中的符號。
nmmain.out
000000000060105cB__bss_start
0000000000601170bcompleted.6337
U__cxa_atexit@@GLIBC_2.2.5
0000000000601058D__data_start
0000000000601058Wdata_start
00000000004007b0tderegister_tm_clones
0000000000400820t__do_global_dtors_aux
0000000000600de8t__do_global_dtors_aux_fini_array_entry
0000000000400978R__dso_handle
0000000000600df8d_DYNAMIC
000000000060105cD_edata
...
使用strip來剝掉main.out中的符號信息,并查看大小,文件基本信息和符號信息。
stripmain.out
llmain.out
-rwxr-xr-x1rootroot6272Mar2216:14main.out
filemain.out
main.out:ELF64-bitLSBexecutable,x86-64,version1(SYSV),dynamicallylinked(usessharedlibs),forGNU/Linux2.6.32,BuildID[sha1]=9d0d7d3718cf9a4cfdc3e026de804e2428bb60fa,stripped
nmmain.out
nm:main.out:nosymbols
可見main.out的大小從9119字節(jié)變?yōu)?272字節(jié),且file命令顯示文件狀態(tài)為stripped,使用nm命令顯示main.out已經(jīng)沒有符號了。
5.小結(jié)
通過上面的例子可以看出,strip 命令可用于剝掉目標(biāo)文件的符號,使文件變小,這就節(jié)省了很多空間。
其實(shí), strip 不僅僅針對可執(zhí)行文件, 還能針對目標(biāo)文件和靜態(tài)、動態(tài)庫等。在實(shí)際的開發(fā)中, 經(jīng)常需要對動態(tài)庫 .so 進(jìn)行 strip 操作, 減少空間。而在調(diào)試的時候(比如用 addr2line),就需要符號了。因此,通常的做法是用 strip 前的庫來調(diào)試,strip 后的庫用來發(fā)布, 發(fā)布的 strip 后的庫一旦出了問題, 就可以找對應(yīng)的未 strip 的庫來定位。
參考文獻(xiàn)
[1] strip manual
[2] GNU Binutils
[3] linux中的strip命令簡介
責(zé)任編輯:xj
原文標(biāo)題:每天一個 Linux 命令(104):strip 命令
文章出處:【微信公眾號:Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
Linux
+關(guān)注
關(guān)注
87文章
11310瀏覽量
209597 -
命令
+關(guān)注
關(guān)注
5文章
684瀏覽量
22034 -
GNU
+關(guān)注
關(guān)注
0文章
143瀏覽量
17501
原文標(biāo)題:每天一個 Linux 命令(104):strip 命令
文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論