linux strip

strip經常用來去除目標文件中的一些符號表、調試符號表信息,以減小程序的大小,在rpmbuild包的最後就用到。
其支持的選項如下:
>strip -h
用法:strip <選項> 輸入文件
從文件中刪除符號和節
 選項爲:
  -I --input-target=<bfdname>      Assume input file is in format <bfdname>
  -O --output-target=<bfdname>     Create an output file in format <bfdname>
  -F --target=<bfdname>            Set both input and output format to <bfdname>
  -p --preserve-dates              Copy modified/access timestamps to the output
  -R --remove-section=<name>       Remove section <name> from the output
  -s --strip-all                   Remove all symbol and relocation information
  -g -S -d --strip-debug           Remove all debugging symbols & sections
     --strip-unneeded              Remove all symbols not needed by relocations
     --only-keep-debug             Strip everything but the debug information
  -N --strip-symbol=<name>         Do not copy symbol <name>
  -K --keep-symbol=<name>          Do not strip symbol <name>
     --keep-file-symbols           Do not strip file symbol(s)
  -w --wildcard                    Permit wildcard in symbol comparison
  -x --discard-all                 Remove all non-global symbols
  -X --discard-locals              Remove any compiler-generated symbols
  -v --verbose                     List all object files modified
  -V --version                     Display this program's version number
  -h --help                        Display this output
     --info                        List object formats & architectures supported
  -o <file>                        Place stripped output into <file>
strip: 支持的目標: elf32-i386 a.out-i386-linux efi-app-ia32 elf32-little elf32-big elf64-alpha ecoff-littlealpha elf64-little elf64-big elf32-littlearm elf32-bigarm elf32-hppa-linux elf32-hppa elf64-ia64-little elf64-ia64-big efi-app-ia64 elf32-m68k a.out-m68k-linux elf32-powerpc aixcoff-rs6000 elf32-powerpcle ppcboot elf64-powerpc elf64-powerpcle aixcoff64-rs6000 elf32-s390 elf64-s390 elf32-sparc a.out-sparc-linux elf64-sparc a.out-sunos-big elf64-x86-64 pe-i386 pei-i386 srec symbolsrec tekhex binary ihex trad-core


目標文件分爲:可重定位文件、可執行文件、共享文件
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
>strip libcmp.a libcmp.so
>strip test
>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就可以了(如果也不調試)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章