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
    +关注

    关注

    88

    文章

    11635

    浏览量

    218104
  • 命令
    +关注

    关注

    5

    文章

    746

    浏览量

    23459
  • GNU
    GNU
    +关注

    关注

    0

    文章

    144

    浏览量

    18241

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    飞凌嵌入式ElfBoard-获取文件的状态信息文件权限

    、可执行文件等。b:表示这是个块设备文件,如硬盘、光驱等。c:表示这是个字符设备文件,如键盘、鼠标等。l:表示这是
    发表于 12-16 08:40

    飞凌嵌入式ElfBoard-获取文件的状态信息之lstat

    1.头文件#include 2.函数原型int lstat(const char *pathname, struct stat *statbuf);3.参数pathname:符号链接的路径
    发表于 12-12 08:51

    飞凌嵌入式ElfBoard-获取文件的状态信息之fstat

    文件描述符,表示已打开的文件。statbuf:指向 struct stat 结构的指针,用于存储文件的状态信息。4.返回值若成功返回0,失
    发表于 12-11 08:44

    飞凌嵌入式ElfBoard-获取文件的状态信息之stat

    、st_ctime宏定义来获取文件的各个时间状态。1)st_mode字段st_mode字段本质上是个32位无符号整形数据,该变量主要记录了文件的类型、
    发表于 12-10 08:42

    飞凌嵌入式ElfBoard-Linux系统基础入门-文件操作相关shell命令

    -v显示详细处理信息-C转到指定目录,用于解压文档-j调用bzip2程序-z调用gzip程序-Z调用compress程序--exclude=PATH排除指定目录,用于打包
    发表于 09-30 09:46

    求助,关于TC387使能以及配置SOTA 中一些问题求解

    你好, 之前我拿到贵司给个demo,里面有一些使能以及配置SWAP的代码, 这里有些疑问 问题1. 判断SOTA功能是否生效,demo中使用的是 SCU_STMEM1中的bit位, 代码如下
    发表于 08-08 07:31

    PCB中的Gerber文件是什么

    Gerber 文件用于电子设计自动化(EDA)中,尤其是在印刷电路板(PCB)设计和制造过程中,传递电路图层、焊盘、走线、元件布局等信息的标准格式。它在PCB制造的各个环节中扮演着至关重要的角色,帮助制造商从设计
    的头像 发表于 08-01 09:20 3865次阅读

    TC399中的SCR代码调试,ELF文件中缺少符号怎么解决?

    的任何调试信息 - 似乎没有调试符号,因此,我无法调试 SCR 代码。 您能否告知 Aurix Development Studio 是否提
    发表于 07-21 07:33

    飞凌嵌入式ElfBoard ELF 1板卡-uboot常用命令文件系统命令

    uboot支持fat格式、ext格式的文件系统。我们主要讲解fat格式文件系统常用命令使用。 、fatinfo fatinfo显示选中的mmc设备指定分区的
    发表于 05-26 17:32

    PCBA加工厂如何制定Gerber文件

    的核心作用 Gerber文件是PCB制造的核心数据格式,用于描述电路板的物理结构,包括: 铜层信息:走线、焊盘、过孔等电气连接。 阻焊层:定义焊盘与走线的保护区域。 丝印层:标注元件标识、符号
    的头像 发表于 05-22 14:15 753次阅读
    PCBA加工厂如何制定Gerber<b class='flag-5'>文件</b>

    TSolidX应用:液晶掩膜结构GDSⅡ文件的生成和导出

    文件一些必要信息 1.2 加载完毕后,即可打开或进行编辑 2. 导出GDSⅡ文件 2.1 在Layout软件中创建好结构后,如下图找到导出选项 2.2 设置导出GDSⅡ
    发表于 05-20 08:45

    ESI文件详解:让EtherCAT网络配置更智能!

    EtherCAT从站信息(ESI)文件种标准化的XML格式文档,专门用于描述EtherCAT从站的特性和配置。它提供了所有必要的详细信息
    的头像 发表于 05-09 17:39 1875次阅读
    ESI<b class='flag-5'>文件</b>详解:让EtherCAT网络配置更智能!

    Allegro Skill封装功能-导出device文件介绍与演示

    Device文件定义了原理图中的符号(Symbol)与实际PCB布局中的封装(Footprint)之间的对应关系。例如,个电阻的原理图符号可能对应多种封装(如0805、0603等),
    发表于 04-19 09:44 1694次阅读
    Allegro Skill封装功能-导出device<b class='flag-5'>文件</b>介绍与演示

    NFS网络文件系统深度解析

    NFS:Network File System 网络文件系统,基于内核的文件系统。Sun 公司开发,通过使用 NFS,用户和程序可以像访问本地文件样访问远端系统上的
    的头像 发表于 03-01 14:15 1195次阅读

    Linux文件管理命令详解

    cat命令描述:该命令用于连接文件并打印到标准输出设备上。
    的头像 发表于 02-17 10:34 909次阅读
    Linux<b class='flag-5'>文件</b>管理<b class='flag-5'>命令</b>详解