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


    strip命令的含义

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

    一、Python中的strip方法

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

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

    1.1 举例说明

    1. #!/usr/bin/python3
    2. ​
    3. str1 = "*****this is **string** example....wow!!!*****"
    4. print("str1: {}".format(str1.strip('*'))) # 在strip方法中指定需要移除的字符串
    5. ​
    6. str2 = " 123abcrunoob321\n"
    7. 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. ​
    4. DESCRIPTION
    5. GNU strip discards all symbols from object files objfile.
    6. The list of object files may include archives.
    7. At least one object file must be given.
    8. ​
    9. 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 8月 5 17:25 strip_cmd
    3. -rw-r--r-- 1 root root 87 8月 5 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 8月 5 17:32 strip_cmd
    4. -rw-r--r-- 1 root root 87 8月 5 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来搞一下吧。

  • 相关阅读:
    初步了解进程、进程调度的基本属性、进程间通信
    消息队列(三):硬盘管理
    Pytest+Allure+Yaml+PyMsql+Jenkins+Gitlab接口自动化(四)Jenkins配置
    Swagger使用
    论文阅读:攻击者的《银河系漫游指南》:开展对互联网资源供应商的路径外攻击以劫持互联网资源 the Hijackers‘ Guide To The Galaxy
    【C/C++笔试练习】OSI分层模型、源端口和目的端口、网段地址、SNMP、状态码、tcp报文、域名解析、HTTP协议、计算机网络、美国节日、分解因数
    Nginx+Tomcat负载均衡、动静分离集群
    kafka源码阅读之MacBook Pro M1搭建Kafka2.7版本源码运行环境
    Oracle中的索引
    【新闻稿】Solv 与 zCloak 联合开发跨境贸易场景下可编程数字凭证项目,获得新加坡、加纳两国央行支持...
  • 原文地址:https://blog.csdn.net/L2111533547/article/details/126181942