注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

strip命令的用法应用  

2015-09-23 10:29:57|  分类: LINUX编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

strip命令的用法应用

 

strip这个命令的接触是在NDKLOCAL_LDFLAGS   += -s(这里是小写),一开始没注意理解成了编译的-S(记得是大写)选项中:

于是查了下Gcc的手册(真心的离不开各种文档啊)

-S
编译后即停止,不进行汇编.对于每个输入的非汇编语言文件,输出文件是汇编语言文件.
缺省情况下, GCC 通过用`.o'替换源文件名后缀`.c', `.i',等等,产生 目标文件名.可以使用-o 选项选择其他名字.

后来发现不是这么回事,仔细看了才发现是LDFLAGS这是链接的标志啊,于是又去查链接器的手册,这才是正主儿啊.
`-s'  注意这是小写
`--strip-all'
忽略输出文件中所有的符号信息。
`-S'   注意这是大写
`--strip-debug'
忽略输出文件中所有的调试符号信息(但不是所有符号)

然后在文档的后面又发现了了这个标记:

'--retain-symbols-file'不丢弃未定义的符号,和需要重定位的符号。
你可能在命令行上只指定'--retain-symbol-file'一次, 它覆盖'-s''-S'的功能。

看来确实是为了减小库的体积大小而增加的啊,用file命令执行了一下,并且与不带-s选项的库进行了比较:

file   libleft.so  

ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped

file libinpu.so

ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, BuildID[sha1]=0xf81aa4d0ab04d86c28e3c38f1744567fa44abcfb, not stripped

有比较才有发现.

那下来看一看这相strip这个命令是干啥滴,有啥用处,怎么用?

http://blog.csdn.net/clozxy/article/details/5581452

更详细看上面的博客地址

用途

通过除去绑定程序和符号调试程序使用的信息,减少扩展公共对象文件格式(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 命令。

 

UNIX下执行文件的减肥工具 strip

 

  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"参数,具有同样的作用。

  某种节约空间的办法:

  那就是对于单个比较大的可执行文件可以编写一个zexec脚本.下面的脚本只是针对/usr/bin/cc

   uncompress ./cc.Z

  mv cc /tmp

  cd /tmp

  ./cc

 

这个命令一般来说是不会影响程序的执行的,但这个不敢打包票.但是如果你要想调试,这事儿可就麻烦了,记得网上曾经有人说过,调试一个多线程的程序,无论如何断点和信息无法出现,后来查看了下多线程的lib库,是strip过的,于是从别的电脑上拷贝了一个没有strip过的覆盖后就好了.这也算是一个坑儿吧.

上面讲过了,如果想查看这上库是否被strip过,执行file命令就可以查看了.

  评论这张
 
阅读(289)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017