UNIX下执行文件的减肥工具strip
来源:互联网 发布:还原软件怎么删除 编辑:程序博客网 时间:2024/05/01 22:10
http://www.ddvip.com/OS/scounix/index3/111.htm
UNIX下文件压缩命令compress大家都比较熟悉了,它的压缩率比较高,
和tar命令结合使用来做数据备份是最合适不过了。但compress压缩也有缺点,就是被压缩后的文件需要用命令uncompress解压后才能正常使
用。而用strip命令就没有这个问题,它能清除执行文件中不必要的标示符及调试信息,可减小文件大小而不影响正常使用。但与compress
不同的是,文件一旦strip后就不能恢复原样了,所以strip是一个减肥工具而不是压缩工具。而且,被strip后的文件不包含调试信息,就不能用
dbx来调试程序了。现在让我们来具体效果如何,看下面一个程序:
#include
main()
{
printf("hello, world\n");
}
用cc编译以后长度为46176字节,用strip后变为了30648,足足减小了 1/3,而且仍然可以正常执行。除了用strip外,
用共享库也是减小执行文件长度的方法。
注:
1.如果文件大小没有减小,那就是已经strip过了.
2.cc 编译时加上"-s"参数,具有同样的作用。
慎用strip
http://www.cublog.cn/opera/showart.php?blogid=11768&id=167134
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
/* 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>cp libcmp.a libcmp.a.bak>cp test test.orig>strip libcmp.a>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
可见无论是静态库(libcmp.a)还是动态库(libcmp.so)还是可执行文件(test),去掉一些符号信息后都减小了很多,但如果这时
再链接这两个库的话是编不过的,因此,如果不是指定特殊的strip选项的话,还是尽量不要对库文件strip,只对链接后的可执行
文件strip就可以了(如果也不调试)。
关于"请问strip命令到底对可执行文件干了什么?"的讨论,见:
http://www.linuxsir.org/bbs/showthread.php?t=239361
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/23458/showart_188534.html
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 文件。
- UNIX下执行文件的减肥工具strip[转载]
- UNIX下执行文件的减肥工具strip
- UNIX下执行文件的减肥工具 strip
- 执行文件的减肥工具strip
- 使用strip给文件减肥
- arm-linux-strip是减肥工具而不是压缩工具
- arm-linux-strip是减肥工具而不是压缩工具
- 使用strip工具减少.so库文件的大小
- Unix 下的查找文件的工具 find
- unix 下的解压缩工具
- 指定目录下的 strip
- strip工具
- strip工具
- 如何执行unix下的exe程序
- unix strip命令
- unix下执行perl
- UNIX 下让 Oracle 定时执行 *.sql 文件
- UNIX下让ORACLE定时执行*.sql文件
- 堆排序
- [小说]魔王冢(61)置之死地(一)
- Oracle Database 11g SQL 开发指南学习笔记:子查询
- Matlab 的 private 文件夹
- ubuntu中利用mysql命令做数据备份,恢复
- UNIX下执行文件的减肥工具strip
- BeautifulSoup入门代码
- Java endorsed
- vc界面优化类之CButtonST类
- SAP图标列表和它们对应的编号
- 关于StopSelf
- Android开发 ListView页脚更新数据崩溃
- 2013 小米校园招聘笔试题之 找异形数
- jsp:setProperty动作