• 爱看广场舞的老爷爷的笔记----strip命令


    strip命令的含义

    strip 这个单词作为动词的时候有: “剥去;剥夺;脱去衣服”的意思

    一、Python中的strip方法

    Python 中字符串对象提供了strip() 方法, 用于移除字符串头尾指定的字符(默认空格、制表符、换行符等)或字符序列。

    注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符

    1.1 举例说明

    1. #!/usr/bin/python3
    2. str1 = "*****this is **string** example....wow!!!*****"
    3. print("str1: {}".format(str1.strip('*'))) # 在strip方法中指定需要移除的字符串
    4. str2 = " 123abcrunoob321\n"
    5. print("str2 orig: {0}; str2 new: {1}".format(str2, str2.strip())) # 在strip方法中不指定任何字符串

    输出结果

    1. str1: this is **string** example....wow!!!
    2. str2 orig: 123abcrunoob321
    3. ; str2 new: 123abcrunoob321

    从上面的结果中可以看到:

    1. 从 str1 中间的星号没有被移除掉, 证明了strip 方法确实只会移除掉字符串前后的指定内容
    2. 从 str2 可以看到如果不指定参数,则会移除掉空格,换行符。

    二、Linux中的strip命令

    2.1 命令的含义

    先看man中的解释:

    1. NAME
    2. strip - discard symbols and other data from object files
    3. DESCRIPTION
    4. GNU strip discards all symbols from object files objfile.
    5. The list of object files may include archives.
    6. At least one object file must be given.
    7. strip modifies the files named in its argument, rather than writing modified copies under different names.

    strip简单的说就是给文件剥掉外衣,具体就是从特定文件中剥掉一些符号信息和调试信息,使文件变小。

    注意: 这里的文件必须是object files, 对于普通的文本文件没啥效果。

    2.2 举例说明

    先看一个简单的C例子, 假设文件名称为strip_cmd.c

    1. [root@shiyan ~]# cat strip_cmd.c
    2. #include
    3. void main()
    4. {
    5. printf("this is strip cmd example! \n");
    6. }

    用gcc编译该文件:

    [root@shiyan ~]# gcc -o strip_cmd strip_cmd.c

    2.2.1 使用strip之前,查看原文件

    使用ls命令来查看该文件大小,如下:

    1. [root@shiyan ~]# ll strip_c*
    2. -rwxr-xr-x 1 root root 8488 85 17:25 strip_cmd
    3. -rw-r--r-- 1 root root 87 85 17:24 strip_cmd.c

    file命令来查看该文件结构,命令file strip_cmd, 输出结果如下:

    1. [root@shiyan ~]# file strip_cmd
    2. strip_cmd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=fb9a4c8597aa494d78f4c7b11f5c9ab852820533, not stripped

    注意最后面的not stripped,说明没有被“剥去”

    nm 命令来查看该文件结构,命令nm strip_cmd, 输出结果如下:

    1. [root@shiyan ~]# cat strip_cmd.c
    2. #include
    3. void main()
    4. {
    5. printf("this is strip cmd example! \n");
    6. }
    7. [root@shiyan ~]# nm strip_cmd
    8. 000000000060102c B __bss_start
    9. 000000000060102c b completed.6355
    10. 0000000000601028 D __data_start
    11. 0000000000601028 W data_start
    12. 0000000000400460 t deregister_tm_clones
    13. 00000000004004d0 t __do_global_dtors_aux
    14. 0000000000600e18 t __do_global_dtors_aux_fini_array_entry
    15. 00000000004005b8 R __dso_handle
    16. 0000000000600e28 d _DYNAMIC
    17. 000000000060102c D _edata
    18. 0000000000601030 B _end
    19. 00000000004005a4 T _fini
    20. 00000000004004f0 t frame_dummy
    21. 0000000000600e10 t __frame_dummy_init_array_entry
    22. 0000000000400700 r __FRAME_END__
    23. 0000000000601000 d _GLOBAL_OFFSET_TABLE_
    24. w __gmon_start__
    25. 00000000004005dc r __GNU_EH_FRAME_HDR
    26. 00000000004003c8 T _init
    27. 0000000000600e18 t __init_array_end
    28. 0000000000600e10 t __init_array_start
    29. 00000000004005b0 R _IO_stdin_used
    30. 0000000000600e20 d __JCR_END__
    31. 0000000000600e20 d __JCR_LIST__
    32. 00000000004005a0 T __libc_csu_fini
    33. 0000000000400530 T __libc_csu_init
    34. U __libc_start_main@@GLIBC_2.2.5
    35. 000000000040051d T main
    36. U puts@@GLIBC_2.2.5
    37. 0000000000400490 t register_tm_clones
    38. 0000000000400430 T _start
    39. 0000000000601030 D __TMC_END__

    从上面的输出中,可以看到很多的符号

    2.2.2 查看使用strip,剥去信息之后的文件

    使用命令strip strip_cmd 来剥去这个文件的信息。

    ls命令来查看该文件大小,如下:

    1. [root@shiyan ~]# strip strip_cmd
    2. [root@shiyan ~]# ll strip_c*
    3. -rwxr-xr-x 1 root root 6344 85 17:32 strip_cmd
    4. -rw-r--r-- 1 root root 87 85 17:24 strip_cmd.c

    可以看到文件大小比原来的变小一些【原来是8488】

    file命令来查看该文件结构,命令file strip_cmd, 输出结果如下:

    1. [root@shiyan ~]# !f
    2. file strip_cmd
    3. strip_cmd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=fb9a4c8597aa494d78f4c7b11f5c9ab852820533, stripped

    可以看到最后已经变成stripped, 说明已经被“剥去”.

    nm 命令来查看该文件结构,命令nm strip_cmd, 输出结果如下:

    1. [root@shiyan ~]# !n
    2. nm strip_cmd
    3. nm: strip_cmd:无符号

    可以看到已经没有符号信息了。

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

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

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

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

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

  • 相关阅读:
    CMAKE语法:target_compile_definitions、message、make -f、add_library
    远程温控系统设计
    Python基础教程:序列排序
    计算机毕设(附源码)JAVA-SSM即时高校信息发布系统
    规则推理桌游
    EMC EMI磁珠的特性
    通话蓝牙耳机什么牌子好?通话工作蓝牙耳机推荐
    基于JAVA智慧物业管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
    未来社区的人车房隐私数据权属确认方法
    vue3 + vite中按需使用ace-builds实现编辑器
  • 原文地址:https://blog.csdn.net/L2111533547/article/details/126181942