0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

strip命令:用于剥掉目标文件中一些符号信息和调试信息,使文件变小

Linux爱好者 来源:Linux爱好者 作者:恋猫大鲤鱼 2021-02-02 11:29 次阅读

1.命令简介

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

2.命令格式

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

intmain()
{
std::cout<<"strip"<

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

g++-omain.outmain.cpp
ll
-rw-r--r--1rootroot68Mar2215:55main.cpp
-rwxr-xr-x1rootroot9119Mar2215:55main.out

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

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

filemain.out
main.out:ELF64-bitLSBexecutable,x86-64,version1(SYSV),dynamicallylinked(usessharedlibs),forGNU/Linux2.6.32,BuildID[sha1]=9d0d7d3718cf9a4cfdc3e026de804e2428bb60fa,notstripped

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

nmmain.out
000000000060105cB__bss_start
0000000000601170bcompleted.6337
U__cxa_atexit@@GLIBC_2.2.5
0000000000601058D__data_start
0000000000601058Wdata_start
00000000004007b0tderegister_tm_clones
0000000000400820t__do_global_dtors_aux
0000000000600de8t__do_global_dtors_aux_fini_array_entry
0000000000400978R__dso_handle
0000000000600df8d_DYNAMIC
000000000060105cD_edata
...

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

stripmain.out

llmain.out
-rwxr-xr-x1rootroot6272Mar2216:14main.out

filemain.out
main.out:ELF64-bitLSBexecutable,x86-64,version1(SYSV),dynamicallylinked(usessharedlibs),forGNU/Linux2.6.32,BuildID[sha1]=9d0d7d3718cf9a4cfdc3e026de804e2428bb60fa,stripped

nmmain.out
nm:main.out:nosymbols

可见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命令简介

责任编辑:xj

原文标题:每天一个 Linux 命令(104):strip 命令

文章出处:【微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11322

    浏览量

    209870
  • 命令
    +关注

    关注

    5

    文章

    688

    浏览量

    22057
  • GNU
    GNU
    +关注

    关注

    0

    文章

    143

    浏览量

    17514

原文标题:每天一个 Linux 命令(104):strip 命令

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux文件查找

    Linux文件查找 1.find查找概述 为什么要有文件查找,因为很多时候我们可能会忘了某个文件所在的位置,此时就需要通过find来查找。 find命令可以根据不同的条件来进行查找
    的头像 发表于 12-03 17:09 294次阅读

    Linux lsof命令的基本用法

    在 linux 系统中,切皆文件。通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以 lsof 命令不仅可以查看进程打开的文件
    的头像 发表于 10-23 11:52 332次阅读
    Linux lsof<b class='flag-5'>命令</b>的基本用法

    hex文件如何查看原c语言代码

    是处理器可以直接执行的指令,而 C 语言代码则是人类可读的高级编程语言代码。 然而,如果你想要从 .hex 文件中获取一些有用的信息或者对程序进行分析,你可以考虑以下几种方法: 反汇编(Disassembly) : 使用反汇编工
    的头像 发表于 09-02 10:37 2525次阅读

    嵌入式学习-常见的shell命令文件操作相关命令

    查找文件里符合条件的字符串参数:grep [选项] 示例: 14、uname列出内核信息命令:uname英文全拼:unix name功能:用于显示系统
    发表于 08-20 09:40

    常见的shell命令文件操作相关命令

    将tar.bz2的压缩包解压到指定目录10、ln创建链接命令命令:ln英文全拼:link files功能:为某文件在另外个位置建立
    发表于 08-19 10:01

    恒讯科技分析:香港服务器的linux如何显示文件内容?

    在Linux系统中查看文件内容有多种方法,以下是一些常用的命令: 1、使用cat命令:这是最基本和常用的查看文件内容的方法。你可以直接输入c
    的头像 发表于 07-19 12:49 232次阅读

    鸿蒙开发文件管理:【@ohos.fileio (文件管理)】

    该模块提供文件存储管理能力,包括文件基本管理、文件目录管理、文件信息统计、文件流式读写等常用功能
    的头像 发表于 06-12 18:12 1296次阅读
    鸿蒙开发<b class='flag-5'>文件</b>管理:【@ohos.fileio (<b class='flag-5'>文件</b>管理)】

    PCBA加工里ODB文件是什么

    所有PCB绘图、布线层、布线图、焊盘堆、夹具等有信息。 它的提出主要用来替代GEBER文件的不足,包含有更多的制造、装配信息、器件信息等等,这也是我们需要的制造
    的头像 发表于 04-10 16:05 1478次阅读

    嵌入式Linux C语言编程程序调试与宏定义

    在Linux使用gcc编译程序的时候,对于调试的语句还具有一些特殊的语法。gcc编译的过程中,会生成一些宏,可以使用这些宏分别打印当前源文件信息
    发表于 03-01 11:41 1063次阅读

    Kubectl核心命令总结:如何快速掌握K8s

    设置 kubectl 命令交互的 kubernetes 集群并修改配置信息。参阅 使用 kubeconfig 文件进行跨集群验证 获取关于配置文件的详细
    的头像 发表于 02-23 14:43 483次阅读
    Kubectl核心<b class='flag-5'>命令</b>总结:如何快速掌握K8s

    Linux系统中一些重要的配置文件介绍

    系统文件用于配置主机名与 IP 地址的映射关系。当系统需要解析主机名时,会首先查找 /etc/hosts 文件,如果在该文件中找到了相应的映射关系,则直接使用对应的 IP 地址进行通
    的头像 发表于 02-19 17:39 3823次阅读

    linux常用命令有哪些

    1.系统常用命令 1、 目录信息查看命令 ls 参数如下: -a 显示所有的文件以及子目录,包括以“ .”开头的隐藏文件 -l 显示
    的头像 发表于 02-04 15:06 481次阅读

    请问PSoC Creator生成Hex文件,如何不添加0x9030_0000 ~ 0x9060_0000信息

    请问 PSoC Creator生成Hex文件,如何不添加0x9030_0000 ~ 0x9060_0000 的信息? 默认IDE生成的hex文件中包含了0x9030_0000等信息,除
    发表于 02-01 08:00

    如何使用linux下gdb来调试python程序

    中,我们将介绍如何在Linux中使用GDB来调试Python程序。 、安装GDB和Python调试符号 在使用GDB调试Python程序之
    的头像 发表于 01-31 10:41 2667次阅读

    是否可以使用XMC Flasher命令行实用程序(bat 文件)将目标闪存读取到*.hex 文件中?

    是否可以使用 XMC Flasher 命令行实用程序(bat 文件)将目标闪存读取到*.hex 文件中?
    发表于 01-26 07:24