Chinaunix首页 | 论坛 | 博客
  • 博客访问: 786465
  • 博文数量: 127
  • 博客积分: 2669
  • 博客等级: 少校
  • 技术积分: 1680
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-23 11:39
文章分类

全部博文(127)

文章存档

2014年(5)

2013年(19)

2012年(25)

2011年(9)

2010年(25)

2009年(44)

分类: LINUX

2009-11-12 10:24:06

strip经常用来去除目标文件中的一些符号表、调试符号表信息,以减小程序的大小,在rpmbuild包的最后就用到。
其支持的选项如下:
>strip -h
用法:strip <选项> 输入文件
从文件中删除符号和节
选项为:
-I --input-target=      Assume input file is in format
-O --output-target=     Create an output file in format
-F --target=            Set both input and output format to
-p --preserve-dates              Copy modified/access timestamps to the output
-R --remove-section=       Remove section 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=         Do not copy symbol
-K --keep-symbol=          Do not strip symbol
     --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                         Place stripped output into
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

测试代码如下:
/* max.c */
int max(int val1, int val2)
{
int iVal = (val1 > val2) ? val1 : val2;
return iVal;
}
/* min.c */
int min(int val1, int val2)
{
int iVal = (val1 < val2) ? val1 : val2;
return iVal;
}

/* main.c */
#include

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就可以了(如果 也不调试)
 
 
阅读(4337) | 评论(0) | 转发(1) |
1

上一篇:binutils详解【转】

下一篇:慎用strip(2)

给主人留下些什么吧!~~