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

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

版权声明:本文为博主原创文章,转载时请务必注明本文地址, 禁止用于任何商业用途, 否则会用法律维权。

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

        我们来看main.c文件:

[cpp] view plain copy
在CODE上查看代码片派生到我的代码片

    #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
在CODE上查看代码片派生到我的代码片

    [taoge@localhost learn_strip]$ ls
    main.c
    [taoge@localhost learn_strip]$ gcc main.c
    [taoge@localhost learn_strip]$ ls -l a.out
    -rwxrwxr-x 1 taoge taoge 4673 Jul 27 05:30 a.out
    [taoge@localhost 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
    [taoge@localhost 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 __libc_start_main@@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
    [taoge@localhost learn_strip]$   

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

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

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

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

[plain] view plain copy
在CODE上查看代码片派生到我的代码片

    [taoge@localhost learn_strip]$ ls
    a.out  main.c
    [taoge@localhost learn_strip]$ strip a.out
    [taoge@localhost learn_strip]$ ls -l a.out
    -rwxrwxr-x 1 taoge taoge 2980 Jul 27 05:34 a.out
    [taoge@localhost 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
    [taoge@localhost learn_strip]$ nm a.out
    nm: a.out: no symbols
    [taoge@localhost 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-10-23 17:58:36

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

详解linux中的strings命令简介_Linux

在Linux下搞软件开发的朋友, 几乎没有不知道strings命令的.我们先用man strings来看看: strings - print the strings of printable characters in files.  意思是, 打印文件中可打印的字符.  我来补充一下吧, 这个文件可以是文本文件(test.c), 可执行文件(test),  动态链接库(test.o), 静态链接库(test.a) 脱离代码地长篇大论而不去实际验证, 不是我的风格. 还是搞点代码下菜吧(代码存在

Linux中使用scp命令进行服务器文件互传

前几天 WordPress大学 所在的服务器环境不太稳定,CPU 占用总是 100%,折腾了好几次都没有找到原因,只好考虑重新配置环境,考虑到配置和优化好环境需要几个小时,总不能将网站停掉吧,所以要将 WordPress大学 网站临时迁移到另外的服务器运行,配置好再迁回来. 看来下阿里云的两个云服务器,都是同一个区的,所以决定通过内网进行文件传输,速度快不说(正常传输文件的速度能达到35m~50m/s),还不占用公网带宽. 阿里云云服务器有一个安全组策略,可能需要设置下 内网入.出方向的IP白名

linux中如何用命令行運行一個so文件?

问题描述 linux中如何用命令行運行一個so文件? 解决方案 so文件是资源库文件,类似于java里的jar包,提供给你使用的资源,SO文件不能单独运行.解决方案二:.so? 冒死不能哎

c语言编程-如何用C语言实现linux中的ll命令?

问题描述 如何用C语言实现linux中的ll命令? 如何用C语言实现linux中的ll命令?大师能给个完整的代码吗?最好有些注释.(我C语言学的不怎么好,害怕看不懂.) 解决方案 C语言实现的linux下ls命令linux "ll" 命令实现在Linux中, 用C语言简单实现chmod命令 解决方案二: 获取文件属性:http://www.cnblogs.com/hnrainll/archive/2011/05/11/2043361.html 遍历文件夹:http://blog.csd

Linux 中如何通过命令行访问 Dropbox

Linux 中如何通过命令行访问 Dropbox 在当今这个多设备的环境下,云存储无处不在.无论身处何方,人们都想通过多种设备来从云存储中获取所需的内容.由于拥有漂亮的 UI 和完美的跨平台兼容性,Dropbox 已成为最为广泛使用的云存储服务. Dropbox 的流行已引发了一系列官方或非官方 Dropbox 客户端的出现,它们支持不同的操作系统平台. 当然 Linux 平台下也有着自己的 Dropbox 客户端: 既有命令行的,也有图形界面客户端.Dropbox Uploader是一个简单易

linux中mount/umount命令的基本用法及开机自动挂载方法_Linux

本文介绍了linux中mount/umount命令的基本用法及开机自动挂载,具体方法如下: mount命令格式如下: 格式:mount [-参数] [设备名称] [挂载点] 其中常用的参数有: -a 安装在/etc/fstab文件中类出的所有文件系统. -f 伪装mount,作出检查设备和目录的样子,但并不真正挂载文件系统. -n 不把安装记录在/etc/mtab 文件中. -r 讲文件系统安装为只读. -v 详细显示安装信息. -w 将文件系统安装为可写,为命令默认情况. -t <文件系统类型

浅谈Linux下通过find命令进行rm文件删除的小技巧_Linux

我们经常会通过find命令进行批量操作,如:批量删除旧文件.批量修改.基于时间的文件统计.基于文件大小的文件统计等,在这些操作当中,由于rm删除操作会导致目录结构变化,如果要通过find结合rm的操作写成脚本,就会遇到一些麻烦,本文通过一个例子为大家进行介绍. 系统环境: SUSE Linux Enterprise Server 11 或 Red Hat Enterprise Linux 问题症状: 客户现场有一个自动化的脚本,有以下的find语句,每天运行以删除某个目录下7天以前的文件或目录,

Linux中使用split来分割合并文件

Linux中使用split来分割合并文件 我们使用split命令来完成: 用法:split [选项]... [输入 [前缀]]将输入内容拆分为固定大小的分片并输出到"前缀aa"."前缀ab",...:默认以 1000 行为拆分单位,默认前缀为"x".如果不指定文件,或者文件为"-",则从标准输入读取数据. 长选项必须使用的参数对于短选项时也是必需使用的.&http://www.aliyun.com/zixun/aggr

Linux中在当前目录下解压rpm文件?

Linux中在当前目录下解压rpm文件? cat kernel-ntfs-2.4.20-8.i686.rpm | rpm2cpio | pax -r 示例如下: [root@localhost 6-18]# cat kernel-ntfs-2.4.20-8.i686.rpm | rpm2cpio | pax -r[root@localhost 6-18]# ll总用量 44-rw-r--r--. 1 root root 40174 6月&http://www.aliyun.com/zixun/a