Linux 命令(60) strip 命令

2021-09-12 02:05:13 字數 4349 閱讀 2526

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的功能一樣都是檢視檔案裡...