strip 命令是 gnu binutils 中的一員,用於剝掉目標檔案中一些符號資訊和除錯資訊,使檔案變小。
strip [-f bfdname |--target=bfdname]
[-i bfdname |--input-target=bfdname]
[-o bfdname |--output-target=bfdname]
[-s|--strip-all]
[-s|-g|-d|--strip-debug]
[--strip-dwo]
[-k symbolname |--keep-symbol=symbolname]
[-n symbolname |--strip-symbol=symbolname]
[-w|--wildcard]
[-x|--discard-all] [-x |--discard-locals]
[-r sectionname |--remove-section=sectionname]
[-o file] [-p|--preserve-dates]
[-d|--enable-deterministic-archives]
[-u|--disable-deterministic-archives]
[--keep-file-symbols]
[--only-keep-debug]
[-v |--verbose] [-v|--version]
[--help] [--info]
objfile...
[-f bfdname |--target=bfdname]:使用指定的二進位制檔案格式(binary format descriptor)解析輸入的目標檔案,輸出目標檔案時也採用相同的格式
[-i bfdname |--input-target=bfdname]:使用指定的二進位制檔案格式(binary format descriptor)解析輸入的目標檔案
[-o bfdname |--output-target=bfdname]:使用指定的二進位制檔案格式(binary format descriptor)輸出目標檔案
[-s|--strip-all]:刪除所有符號
[-s|-g|-d|--strip-debug]:僅刪除除錯符號
[--strip-dwo]:刪除所有dwarf .dwo節的內容,保留其餘除錯節和所有符號不變
[-k symbolname |--keep-symbol=symbolname]:保留原始檔中指定的符號symbolname
[-n symbolname |--strip-symbol=symbolname]:從原始檔中刪除符號symbolname。此選項可能不止一次
[-w|--wildcard]:允許在其他命令列選項中對符號名稱使用正規表示式。問號(?)、星號(*)、反斜槓(\)和方括號()運算子可以在符號名的任何位置使用
[-x|--discard-all]:刪除非全域性符號
[-x |--discard-locals]:刪除編譯器生成的本地符號
[-r sectionname |--remove-section=sectionname]:從輸出檔案中刪除名為sectionname的任何節。此選項可能會給出多次。請注意,不適當地使用此選項可能會使輸出檔案不可用。萬用字元*可以在sectionname的末尾給出。如果是這樣,則將刪除以sectionname開頭的任何節
[-o file]:將剝離的輸出放入檔案 file 中,而不是替換現有檔案。使用此引數時,只能指定乙個objfile
[-p|--preserve-dates]:保留檔案的訪問和修改日期
[-d|--enable-deterministic-archives]:以確定性模式(deterministic mode)操作。複製存檔成員和寫入存檔索引時,對uids、gids、時間戳使用零,對所有檔案使用一致的檔案模式
[-u|--disable-deterministic-archives]:不以確定性模式(deterministic mode)操作。這與上面的-d選項相反:複製存檔成員並寫入存檔索引時,使用它們的實際uid、gid、時間戳和檔案模式值
[--keep-file-symbols]:保留符號資訊
[--only-keep-debug]:保留除錯資訊
[-v |--verbose] :詳細輸出:列出所有修改的物件檔案。對於歸檔檔案,strip-v 列出了歸檔檔案的所有成員
[-v|--version]:顯示版本資訊
[-h|--help]:顯示幫助資訊
[--info]:列出支援的目標檔案格式和架構
objfile...:目標檔案,包括庫檔案或可執行檔案
先看乙個 c++ 原始碼檔案 main.cpp。
//
//@file:main.cpp
//#include int main()
{ std::cout<<"strip"《使用 g++ 編譯生成可執行檔案 main.out。
g++ -o main.out main.cpp
ll-rw-r--r-- 1 root root 68 mar 22 15:55 main.cpp
-rwxr-xr-x 1 root root 9119 mar 22 15:55 main.out
(1)剝掉可執行檔案中一些符號資訊和除錯資訊,使檔案變小。
首先使用file命令來檢視可執行檔案main.out的基本資訊,可見其是not stripped。
file main.out
main.out: elf 64-bit lsb executable, x86-64, version 1 (sysv), dynamically linked (uses shared libs), for gnu/linux 2.6.32, buildid[sha1]=9d0d7d3718cf9a4cfdc3e026de804e2428bb60fa, not stripped
然後使用 nm 命令來檢視 main.out 中的符號。
nm main.out
000000000060105c b __bss_start
0000000000601170 b completed.6337
u __cxa_atexit@@glibc_2.2.5
0000000000601058 d __data_start
0000000000601058 w data_start
00000000004007b0 t deregister_tm_clones
0000000000400820 t __do_global_dtors_aux
0000000000600de8 t __do_global_dtors_aux_fini_array_entry
0000000000400978 r __dso_handle
0000000000600df8 d _dynamic
000000000060105c d _edata
...
使用strip來剝掉main.out中的符號資訊,並檢視大小,檔案基本資訊和符號資訊。
strip main.out
ll main.out
-rwxr-xr-x 1 root root 6272 mar 22 16:14 main.out
file main.out
main.out: elf 64-bit lsb executable, x86-64, version 1 (sysv), dynamically linked (uses shared libs), for gnu/linux 2.6.32, buildid[sha1]=9d0d7d3718cf9a4cfdc3e026de804e2428bb60fa, stripped
nm main.out
nm: main.out: no symbols
可見main.out的大小從9119位元組變為6272位元組,且file命令顯示檔案狀態為stripped,使用nm命令顯示main.out已經沒有符號了。
通過上面的例子可以看出,strip 命令可用於剝掉目標檔案的符號,使檔案變小,這就節省了很多空間。
其實, strip 不僅僅針對可執行檔案, 還能針對目標檔案和靜態、動態庫等。在實際的開發中, 經常需要對動態庫 .so 進行 strip 操作, 減少空間。 而在除錯的時候(比如用 addr2line),就需要符號了。因此,通常的做法是用 strip 前的庫來除錯,strip 後的庫用來發布, 發布的 strip 後的庫一旦出了問題, 就可以找對應的未 strip 的庫來定位。
[1] strip manual
[2] gnu binutils
[3] linux中的strip命令簡介
Linux命令學習 gzip gunzip命令
gzip是linux上用於壓縮檔案和解壓字尾為.gz檔案的命令。gunzip就是gzip的硬連線,用於解壓被gzip壓縮的.gz檔案。所以gzip命令壓縮檔案和解壓.gz檔案可以完全搞定,gunzip只是為解壓.gz檔案提供了另一種選擇。gzip acdfhllnnqrtvv s 壓縮字尾字串 壓縮...
linux man命令 詳解 Linux 幫助命令
linux 系統的命令數量有上千個,每個命令又有若干個甚至數十個引數指出不同情景下的使用。有一些命令是我們日常工作需要經常使用的,即便不是特意背命令,也會因熟能生巧而印象深刻。但是對於那些不熟悉的命令,或者是熟悉命令的不熟悉的引數呢?當然,我們不需要耗費大量精力去記憶這些命令和引數,只需要正確使用l...
Linux命令之 more命令與less命令》
more命令,功能 類似 cat cat命令 是整個檔案的內容從上到下顯示在螢幕上。more more命令從前向後讀取檔案,因此在啟動時就載入整個檔案。1 命令格式 more dlfpcsu num pattern linenum file 2 命令功能 more命令和cat的功能一樣都是檢視檔案裡...