linux中的strip命令简介------给文件脱衣服

转载于:http://blog.csdn.net/stpeace/article/details/47090255

作为一名linux开发人员, 如果没有听说过strip命令, 那是很不应该的。 strip这个单词, 大家应该早就学过了, 你就记住是脱衣服就行了, 别的不要多想。 在linux中, strip也有脱衣服的含义, 具体就是从特定文件中剥掉一些符号信息和调试信息。

我们来看main.c文件:

[cpp] view plain copy print?

  1. #include <stdio.h>
  2. int add(int x, int y)
  3. {
  4. return x + y;
  5. }
  6. int aaa;
  7. int bbb = 1;
  8. char szTest[] = "good";
  9. int main()
  10. {
  11. int ccc = 2;
  12. return 0;
  13. }
#include <stdio.h>

int add(int x, int y)
{
	return x + y;
}

int aaa;
int bbb = 1;
char szTest[] = "good";

int main()
{
	int ccc = 2;
	return 0;
}

然后我们看看结果:

[plain] view plain copy print?

  1. [[email protected] learn_strip]$ ls
  2. main.c
  3. [[email protected] learn_strip]$ gcc main.c
  4. [[email protected] learn_strip]$ ls -l a.out
  5. -rwxrwxr-x 1 taoge taoge 4673 Jul 27 05:30 a.out
  6. [[email protected] learn_strip]$ file a.out
  7. a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
  8. [[email protected] learn_strip]$ nm a.out
  9. 08049538 d _DYNAMIC
  10. 08049604 d _GLOBAL_OFFSET_TABLE_
  11. 0804847c R _IO_stdin_used
  12. w _Jv_RegisterClasses
  13. 08049528 d __CTOR_END__
  14. 08049524 d __CTOR_LIST__
  15. 08049530 D __DTOR_END__
  16. 0804952c d __DTOR_LIST__
  17. 08048520 r __FRAME_END__
  18. 08049534 d __JCR_END__
  19. 08049534 d __JCR_LIST__
  20. 08049628 A __bss_start
  21. 08049618 D __data_start
  22. 08048430 t __do_global_ctors_aux
  23. 08048310 t __do_global_dtors_aux
  24. 08048480 R __dso_handle
  25. w __gmon_start__
  26. 0804842a T __i686.get_pc_thunk.bx
  27. 08049524 d __init_array_end
  28. 08049524 d __init_array_start
  29. 080483c0 T __libc_csu_fini
  30. 080483d0 T __libc_csu_init
  31. U [email protected]@GLIBC_2.0
  32. 08049628 A _edata
  33. 08049634 A _end
  34. 0804845c T _fini
  35. 08048478 R _fp_hw
  36. 08048274 T _init
  37. 080482e0 T _start
  38. 08049630 B aaa
  39. 08048394 T add
  40. 0804961c D bbb
  41. 08049628 b completed.5963
  42. 08049618 W data_start
  43. 0804962c b dtor_idx.5965
  44. 08048370 t frame_dummy
  45. 080483a2 T main
  46. 08049620 D szTest
  47. [[email protected] learn_strip]$
[[email protected] learn_strip]$ ls
main.c
[[email protected] learn_strip]$ gcc main.c
[[email protected] learn_strip]$ ls -l a.out
-rwxrwxr-x 1 taoge taoge 4673 Jul 27 05:30 a.out
[[email protected] learn_strip]$ file a.out
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
[[email protected] learn_strip]$ nm a.out
08049538 d _DYNAMIC
08049604 d _GLOBAL_OFFSET_TABLE_
0804847c R _IO_stdin_used
         w _Jv_RegisterClasses
08049528 d __CTOR_END__
08049524 d __CTOR_LIST__
08049530 D __DTOR_END__
0804952c d __DTOR_LIST__
08048520 r __FRAME_END__
08049534 d __JCR_END__
08049534 d __JCR_LIST__
08049628 A __bss_start
08049618 D __data_start
08048430 t __do_global_ctors_aux
08048310 t __do_global_dtors_aux
08048480 R __dso_handle
         w __gmon_start__
0804842a T __i686.get_pc_thunk.bx
08049524 d __init_array_end
08049524 d __init_array_start
080483c0 T __libc_csu_fini
080483d0 T __libc_csu_init
         U [email protected]@GLIBC_2.0
08049628 A _edata
08049634 A _end
0804845c T _fini
08048478 R _fp_hw
08048274 T _init
080482e0 T _start
08049630 B aaa
08048394 T add
0804961c D bbb
08049628 b completed.5963
08049618 W data_start
0804962c b dtor_idx.5965
08048370 t frame_dummy
080483a2 T main
08049620 D szTest
[[email protected] learn_strip]$

通过ls -l 命令可知, a.out的大小是4673个字节;

通过file命令可知, a.out是可执行文件, 且是not stripped, 也就是说没有脱衣服。

通过nm命令, 可以读出a.out中的符号信息。

现在, 我把a.out的衣服strip掉, 得到的结果为:

[plain] view plain copy print?

  1. [[email protected] learn_strip]$ ls
  2. a.out  main.c
  3. [[email protected] learn_strip]$ strip a.out
  4. [[email protected] learn_strip]$ ls -l a.out
  5. -rwxrwxr-x 1 taoge taoge 2980 Jul 27 05:34 a.out
  6. [[email protected] learn_strip]$ file a.out
  7. a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
  8. [[email protected] learn_strip]$ nm a.out
  9. nm: a.out: no symbols
  10. [[email protected] learn_strip]$
[[email protected] learn_strip]$ ls
a.out  main.c
[[email protected] learn_strip]$ strip a.out
[[email protected] learn_strip]$ ls -l a.out
-rwxrwxr-x 1 taoge taoge 2980 Jul 27 05:34 a.out
[[email protected] learn_strip]$ file a.out
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
[[email protected] learn_strip]$ nm a.out
nm: a.out: no symbols
[[email protected] learn_strip]$ 

通过ls -l 命令可知, a.out的大小是2980个字节, 大大减小;

通过file命令可知, a.out是可执行文件, 且是stripped, 也就是说衣服被脱了;

通过nm命令, 发现a.out中的符号没有了。

由此可见, strip用于脱掉文件的衣服, 文件会变小, 其中的符号信息会失去。 那这个strip有什么用呢? 很有用的! 原来的a.out比较大, 可以执行。 在strip之后, 文件变小了, 仍然可以执行, 这就就节省了很多空间。

其实, strip不仅仅可以针对可执行文件, 还能针对目标文件和动态库等。

在实际的开发中, 经常需要对动态库.so进行strip操作, 减少占地空间。 而在调试的时候(比如用addr2line), 就需要符号了。 因此, 通常的做法是: strip前的库用来调试, strip后的库用来实际发布, 他们两者有对应关系。 一旦发布的strip后的库出了问题, 就可以找对应的未strip的库来定位。

最后啰嗦一句, 某某动态库strip前是18M左右, strip后是3M左右, 可见, 脱脱衣服还是有明显好处的。

补充: 后来发现, 在调试过程中, 经常涉及到传库, 库太大时, 很耗费传输时间, 所以还是用strip来搞一下吧。

时间: 2024-09-29 21:54:42

linux中的strip命令简介------给文件脱衣服的相关文章

linux中的strings命令简介

摘自:http://blog.csdn.net/stpeace/article/details/46641069 linux中的strings命令简介 在linux下搞软件开发的朋友, 几乎没有不知道strings命令的.我们先用man strings来看看: strings - print the strings of printable characters in files. 意思是, 打印文件中可打印的字符.  我来补充一下吧, 这个文件可以是文本文件(test.c), 可执行文件(te

linux中的strings命令简介2

摘自:http://blog.csdn.net/stpeace/article/details/46641069 linux中的strings命令简介 之前我们聊过linux strings的用法和用途, 但据我了解, 还有部分朋友并不常用strings, 这是个不好的习惯. 所以, 本文继续啰嗦一下strings命令. 在软件开发中, 我们经常需要修改代码, 并生成静态库.动态库或者可执行文件, 有时候, 工程太大, 那怎样确定自己改动的代码正确编译到库中去了呢? 用strings命令吧!  

linux中的nm命令简介

转:http://blog.csdn.net/stpeace/article/details/47089585 一般来说, 搞linux开发的人, 才会用到nm命令, 非开发的人, 应该用不到. 虽然nm很简单, 但是还是有必要写几句, 聊表心意. nm不是ni ma的缩写, 当然, 也不是ni mei的缩写, 而是names的缩写, nm命令主要是用来列出某些文件中的符号(说白了就是一些函数和全局变量等).  下面, 我们一起来看看. test.h为: [cpp] view plain cop

Linux命令简介(文件/目录权限操作命令)

文件/目录权限 文件/目录的属性 1.权限 读取.写入.可执行 2.归属 属主.属组 注意:root用户是系统的超级用户,拥有完全的管理权限,所以目录的权限限制对root用户将不起作用.它只是针对普通用户来说的. 权限字符表示 权限      文件                目录 r         查看文件内容        查看目录内容(显示子目录.文件列表) w         修改文件内容        修改目录内容(在目录中新建.移动.删除文件或子目录) x         执行该

教你在Linux中如何用命令或手动修改文件来添加一个用户

教你在Linux中如何使用命令或手动修改文件添加一个用户 首先我们从一个例子进行引入:添加一个happy用户,基本组为happy(5200),附加组为luzhi. 一.用命令的方法实现: groupadd -g 5200 happy useradd -u 5200 -g happy -G luzhi  happy passwd happy su - happy 这样就这个用户就创建成功了. 下面来演示一下: 验证系统中是否存在happy用户,从输出看是没有存在happy用户的. 2.我们先建一个

Linux中几种常用的查看文件内容的命令(file,cat,more,less,head,tail)

Linux中有几个命令可以查看文件的内容,而不需要调用其他的文本编辑器,如vim. 1.file查看文件类型 file命令可以探测文件的内部,并能查看到文件是什么类型的. 2. cat命令 cat命令时一个用于显示文本文件中所有数据的比较好用的工具 cat test.txt cat 可以带一些参数,会对显示的结果有帮助 -n参数会给所有的行加上行号 -b参数 只是给有文本的行加上行号. 对于有大量文本内容的文件,使用cat不太方便,可以使用下面的几个分页工具. 3. more命令 cat命令的缺

linux中的压缩命令详细解析(二)

我们在<Linux中的压缩命令详细解析(一)>中已经讲解了常见的三种压缩命令,下面我们开始讲解工作中最常用到的tar命令. 为了使压缩和解压缩变得简单,tar命令就应运而生了.那么究竟该如何使用呢? tar.gz格式: 压缩命令: tar -zcvf 压缩文件名 源文件名 举例: 把abc文件压缩成后缀为tar.gz格式的文件 tar -zcvf abc.tar.gz abc 解压缩命令: 举例:解压缩abc.tar.gz文件 tar -zxvf abc.tar.gz tar.bz2格式: 压

Linux中的In命令

ln是linux中一个非常重要命令.它的功能是为某一个文件在另外一个位置建立一个同步的链接,这个命令最常用的参数是-s,具体用法是: ln -s  源文件 目标文件    -s 是 symbolic的意思. 例:ln  -s  /lib/lsb   /usr/lj即:在usr目录下建立指向/lib/lsb目录的lj文件. 当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下用ln命令链接(link

辛星浅析linux中的ac命令

linux中的ac命令根据当前/var/log/wtmp文件中的登录的进入和退出来报告用户连接的时间,默认是以小时为单位,如果不使用标识,则报告的是总时间. 它的主要参数有两个: (1)-d将显示每天的连接时间. (2)-p将显示每个用户的连接时间.