1.命令简介

strip 命令是 GNU Binutils 中的一员,用于剥掉目标文件中一些符号信息和调试信息,使文件变小。

2.命令格式

strip [-F bfdname |--target=bfdname][-I bfdname |--input-target=bfdname][-O bfdname |--output-target=bfdname][-s|--strip-all][-S|-g|-d|--strip-debug][--strip-dwo][-K symbolname |--keep-symbol=symbolname][-N symbolname |--strip-symbol=symbolname][-w|--wildcard][-x|--discard-all] [-X |--discard-locals][-R sectionname |--remove-section=sectionname][-o file] [-p|--preserve-dates][-D|--enable-deterministic-archives][-U|--disable-deterministic-archives][--keep-file-symbols][--only-keep-debug][-v |--verbose] [-V|--version][--help] [--info]objfile...

3.选项说明

   [-F bfdname |--target=bfdname]:使用指定的二进制文件格式(Binary Format Descriptor)解析输入的目标文件,输出目标文件时也采用相同的格式[-I bfdname |--input-target=bfdname]:使用指定的二进制文件格式(Binary Format Descriptor)解析输入的目标文件[-O bfdname |--output-target=bfdname]:使用指定的二进制文件格式(Binary Format Descriptor)输出目标文件[-s|--strip-all]:删除所有符号[-S|-g|-d|--strip-debug]:仅删除调试符号[--strip-dwo]:删除所有DWARF .dwo节的内容,保留其余调试节和所有符号不变[-K symbolname |--keep-symbol=symbolname]:保留源文件中指定的符号symbolname[-N symbolname |--strip-symbol=symbolname]:从源文件中删除符号symbolname。此选项可能不止一次[-w|--wildcard]:允许在其他命令行选项中对符号名称使用正则表达式。问号(?)、星号(*)、反斜杠(\)和方括号([])运算符可以在符号名的任何位置使用[-x|--discard-all]:删除非全局符号[-X |--discard-locals]:删除编译器生成的本地符号[-R sectionname |--remove-section=sectionname]:从输出文件中删除名为sectionname的任何节。此选项可能会给出多次。请注意,不适当地使用此选项可能会使输出文件不可用。通配符*可以在sectionname的末尾给出。如果是这样,则将删除以sectionname开头的任何节[-o file]:将剥离的输出放入文件 file 中,而不是替换现有文件。使用此参数时,只能指定一个objfile[-p|--preserve-dates]:保留文件的访问和修改日期[-D|--enable-deterministic-archives]:以确定性模式(deterministic mode)操作。复制存档成员和写入存档索引时,对UIDs、GIDs、时间戳使用零,对所有文件使用一致的文件模式[-U|--disable-deterministic-archives]:不以确定性模式(deterministic mode)操作。这与上面的-D选项相反:复制存档成员并写入存档索引时,使用它们的实际UID、GID、时间戳和文件模式值[--keep-file-symbols]:保留符号信息[--only-keep-debug]:保留调试信息[-v |--verbose] :详细输出:列出所有修改的对象文件。对于归档文件,strip-v 列出了归档文件的所有成员[-V|--version]:显示版本信息[-h|--help]:显示帮助信息[--info]:列出支持的目标文件格式和架构objfile...:目标文件,包括库文件或可执行文件

4.常用示例

先看一个 C++ 源码文件 main.cpp。

//
//@file:main.cpp
//#include <iostream>int main()
{std::cout<<"strip"<<std::endl;
}

使用 g++ 编译生成可执行文件 main.out。

g++ -o main.out main.cpp
ll
-rw-r--r-- 1 root root     68 Mar 22 15:55 main.cpp
-rwxr-xr-x 1 root root   9119 Mar 22 15:55 main.out

(1)剥掉可执行文件中一些符号信息和调试信息,使文件变小。

首先使用file命令来查看可执行文件main.out的基本信息,可见其是not stripped。

file main.out
main.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=9d0d7d3718cf9a4cfdc3e026de804e2428bb60fa, not stripped

然后使用 nm 命令来查看 main.out 中的符号。

nm main.out
000000000060105c B __bss_start
0000000000601170 b completed.6337U __cxa_atexit@@GLIBC_2.2.5
0000000000601058 D __data_start
0000000000601058 W data_start
00000000004007b0 t deregister_tm_clones
0000000000400820 t __do_global_dtors_aux
0000000000600de8 t __do_global_dtors_aux_fini_array_entry
0000000000400978 R __dso_handle
0000000000600df8 d _DYNAMIC
000000000060105c D _edata
...

使用strip来剥掉main.out中的符号信息,并查看大小,文件基本信息和符号信息。

strip main.outll main.out
-rwxr-xr-x 1 root root 6272 Mar 22 16:14 main.outfile main.out
main.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=9d0d7d3718cf9a4cfdc3e026de804e2428bb60fa, strippednm main.out
nm: main.out: no symbols

可见main.out的大小从9119字节变为6272字节,且file命令显示文件状态为stripped,使用nm命令显示main.out已经没有符号了。

5.小结

通过上面的例子可以看出,strip 命令可用于剥掉目标文件的符号,使文件变小,这就节省了很多空间。

其实, strip 不仅仅针对可执行文件, 还能针对目标文件和静态、动态库等。在实际的开发中, 经常需要对动态库 .so 进行 strip 操作, 减少空间。 而在调试的时候(比如用 addr2line),就需要符号了。因此,通常的做法是用 strip 前的库来调试,strip 后的库用来发布, 发布的 strip 后的库一旦出了问题, 就可以找对应的未 strip 的库来定位。


参考文献

[1] strip manual
[2] GNU Binutils
[3] linux中的strip命令简介

Linux 命令(60)—— strip 命令相关推荐

  1. Linux常用的命令--60个命令总结汇总

    Linux常用60个命令--实例详解 注:Linux系统中的命令实在是太多了,不可能像在MS DOS中把所有的命令及参数都记住.Linux系统提供了一些方法,比如可以通过"help" ...

  2. linux常用60条命令 转

    Linux必学的60个命令 Linux提供了大量的命令,利用它可以有效地完成大量的工 作,如磁盘操作.文件存取.目录操作.进程管理.文件权限设定等.所以,在Linux系统上工作离不开使用系统提供的命令 ...

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

            作为一名linux开发人员, 如果没有听说过strip命令, 那是很不应该的. strip这个单词, 大家应该早就学过了, 你就记住是脱衣服就行了, 别的不要多想. 在linux中, ...

  4. Linux常用60个命令用法

    原文链接:Linux常用的60个命令用法 - Accwiz - 博客园 Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作.文件存取.目录操作.进程管理.文件权限设定等.所以,在L ...

  5. 【Linux】linux中的strip命令

    DATE: 2018.11.13 1.参考 https://blog.csdn.net/qq_37858386/article/details/78559490 2.strip命令 strip作用:从 ...

  6. linux中的strip命令(代码打包时瘦身减小大小)

    常用方法 strip abc/* 功能 从目标文件或可执行文件中剥掉一些符号信息和调试信息,使文件变小. 打包时用最合适不过了,可直接缩身包大小. 使用 测试代码abc.c #include < ...

  7. 常用的linux命令cd,linux常用命令:cd 命令

    Linux cd 命令可以说是Linux中最基本的命令语句,其他的命令语句要进行操作,都是建立在使用 cd 命令上的.所以,学习Linux 常用命令,首先就要学好 cd 命令的使用方法技巧. 1. 命 ...

  8. linux 必须掌握的60个命令

    Linux必学的60个命令 http://blog.csdn.net/ustc_dylan/article/details/4152501 Linux提供了大量的命令,利用它可以有效地完成大量的工 作 ...

  9. linux中常用的60个命令及作用详解

    Linux 必学的 60 个命令 Linux 提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作.文件存 取.目录操作.进程管理.文件权限设定等.所以,在 Linux 系统上工作离不开使用系 ...

最新文章

  1. IDEA构建一个mybatis项目
  2. Django站点管理、视图和URL(管理界面本地化、创建管理员、注册模型类、发布内容到数据库、定义视图、配置URLconf)
  3. dosbox edit.exe 如何使用_如何实现摄影后期无限色彩调色?Infinite Color
  4. 神策数据《银行4.0数字化运营体系构建的方法与实践》正式发布
  5. DynamicDataDisplay 实时曲线图的使用和沿轴移动的效果
  6. C++ Unicode和ANSII转换
  7. 安装LibreOffice和字体
  8. 艾伟:C# Design Patterns (1) - Factory Method
  9. python权威指南 pdf_Ansible权威指南pdf txt mobi下载及读书笔记
  10. 使用Python+pillow绘制矩阵盖尔圆
  11. 【Demo 0003】Java基础-数组
  12. Linux下iptables 禁止端口和开放端口
  13. 使用一个插件将Zend Framework应用程序的内容转换为xml
  14. 特斯拉model3中控屏怎么关_对话特斯拉首席设计师Franz:设计为效率服务
  15. 解决keil注册机和编译错误的问题2020-12-28
  16. 快速失败(ail-fast)和安全失败(fail-safe)机制
  17. 三星i919u android 6,SCH-I919U
  18. 一步控制台编译java_在控制台运行一个 Java 程序 Test . class ,使用的命令正确的是( )_学小易找答案...
  19. 个人成长:简单写写《乔布斯传》读后感
  20. C++多项式除法的探讨

热门文章

  1. 详情和 PoC 发布后,谷歌匆忙修复严重的 Gmail 漏洞
  2. SaltStack Salt 开源管理框架修复2个严重漏洞,多款开源产品等受影响
  3. ReactNative从零到完整项目-Flexbox使用
  4. linux --- TCPdump 工具
  5. [笔记].关于使用JLINK的三线SWD模式调试NUC1xx的一点粗浅认识
  6. 十种最受前辈宠爱的职场新人
  7. 数据绑定--Repeater, DataList, or GridView?
  8. Vlan配置详解之三层交换
  9. 关于超过255台电脑的内网IP规划问题
  10. cookie不正确 请重新登录_小学多陪,初中少陪,高中不陪!小学6年陪孩子写作业的正确方式,请家长收下!...