1. 程式人生 > >Linux strip命令的用法

Linux strip命令的用法

strip 命令
用途
通過除去繫結程式和符號除錯程式使用的資訊,減少擴充套件公共物件檔案格式(XCOFF)的物件檔案的大小。

語法
strip [ -V] [  -r [  -l ] |  -x [  -l ] |  -t |  -H |  -e |  -E ] [  -X  {32|64|32_64}] [  -- ]  File ...-
 


描述
strip 命令減少 XCOFF 物件檔案的大小。strip 命令從 XCOFF 物件檔案中有選擇地除去行號資訊、重定位資訊、除錯段、typchk 段、註釋段、檔案頭以及所有或部分符號表。 一旦您使用該命令,則很難除錯檔案的符號;因此,通常應該只在已經除錯和測試過的生成模組上使用 strip 命令。使用 strip 命令減少物件檔案所需的儲存量開銷。

對於每個物件模組,strip 命令除去給出的選項所指定的資訊。對於每個歸檔檔案,strip 命令從歸檔中除去全域性符號表。

可以使用 ar -s 命令將除去的符號表恢復到歸檔檔案或庫檔案中。

沒有選項的 strip 命令除去行號資訊、重定位資訊、符號表、除錯段、typchk 段和註釋段。

標誌
-e 在物件檔案的可選頭中設定 F_LOADONLY 標誌。如果物件檔案放置在歸檔中,則該標誌告知繫結程式(ld 命令),在與此歸檔連結時應忽略該物件檔案中的符號。
-E 復位(關閉)物件檔案的可選頭中的 F_LOADONLY 位。(請參閱 -e 標誌。)
-H 除去物件檔案頭、任何可選的頭以及所有段的頭部分。
注:不除去符號表資訊。
-l (小寫 L)從物件檔案中除去行號資訊。


-r 除了外部符號和靜態符號條目,將全部符號表資訊除去。不除去重定位資訊。同時除去除錯段和 typchk 段。這個選項產生一個物件檔案,該物件檔案仍可以用作輸入到連結編輯器(ld 命令)中。
-t 除去大多數符號表資訊,但並不除去函式符號或行號資訊。
-V 列印 strip 命令的版本號。
-x 除去符號表資訊,但並不除去靜態或外部符號資訊。 -x 標誌同時除去重定位資訊,因此將不可能連結到該檔案。
-X mode 指定應檢查 strip 的物件檔案的型別。 mode 必須是下列之一:
32
只處理 32 位物件檔案
64
只處理 64 位物件檔案
32_64
既處理 32 位物件檔案,又處理 64 位物件檔案
預設值是處理 32 位物件檔案(忽略 64 位物件檔案)。也可以用 OBJECT_MODE 環境變數來設定 mode。例如,OBJECT_MODE=64 使 strip 處理任何 64 位物件檔案,並忽略 32 位物件檔案。-X 標誌重設 OBJECT_MODE 變數。
 
-- (雙連字元)將跟隨在該標誌後的所有引數解釋為檔名。這就允許除去名稱是以連字元開始的檔案。

退出狀態
該命令返回以下退出值:

0 成功完成。
>0 出錯。

示例
要除去 a.out 檔案中的符號表和行號資訊,請輸入:
strip a.out要除去 a.out 檔案中的物件檔案頭,請輸入:
strip -H a.out要除去 lib.a 中的 32 位和 64 位符號表,請輸入:
strip -X 32_64 lib.a檔案
/usr/ccs/bin/strip 包含 strip 命令。

相關資訊
ar 命令、as 命令、dump 命令、ld 命令、size 命令。

ar 檔案、a.out 檔案。

目標檔案分為:可重定位檔案、可執行檔案、共享檔案
strip的預設選項會去除.symbol節的內容以及.debug節的內容,因此儘量只對可執行檔案執行strip而不要對靜態庫或動態庫等目標檔案strip

測試程式碼如下:

 int max(int val1, int val2)
{
 int iVal = (val1 > val2) ? val1 : val2;
 return iVal;
}
 int min(int val1, int val2)
{
 int iVal = (val1 < val2) ? val1 : val2;
 return iVal;
}
 #include <stdio.h>
 
 extern int max(int val1, int val2);
 extern int min(int val1, int val2);
 
 int main()
{
 int val1, val2;
 
scanf("%d%d", &val1, &val2);
printf("%d\n", max(val1, val2));
printf("%d\n", min(val1, val2));
}

>gcc -c max.c min.c
>ar rcs libcmp.a max.o min.o
>gcc -o test main.c libcmp.a
>gcc -share -fPIC -o libcmp.so max.c min.c

>cp libcmp.a libcmp.a.bak
>cp libcmp.so libcmp.so.bak
>cp test test.orig
>striplibcmp.a libcmp.so
>striptest
>ll -h
總計 92K
-rwxr-xr-x 1 6.9K a.out
-rw-r--r-- 1 1.1K libcmp.a
-rw-r--r-- 1 1.6K libcmp.a.bak
-rwxr-xr-x 1 2.9K libcmp.so
-rwxr-xr-x 1 5.3K libcmp.so.bak
-rw-r--r-- 1 237 main.c
-rw-r--r-- 1  89 max.c
-rw-r--r-- 1 695 max.o
-rw-r--r-- 1  89 min.c
-rw-r--r-- 1 695 min.o
-rwxr-xr-x 1 3.2K test
-rwxr-xr-x 1 6.8K test.orig

選項簡釋:
The -fPIC flag directs the compiler to generate position independent code section).
The -shared flag directs the linker to create a shared object file.

可見無論是靜態庫(libcmp.a)還是動態庫(libcmp.so)還是可執行檔案(test),去掉一些符號資訊後都減小了很多,但如果這時再連結這兩個庫的話是編不過的,因此,如果不是指定特殊的strip選項的話,還是儘量不要對庫檔案strip,只對連結後的可執行檔案strip就可以了(如果也不除錯)。