linux 可执行程序中加入符号信息,strip命令:用于剥掉目标文件中一些符号信息和调试信息,使文件变小...

1.命令简介

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

2.命令格式

b7b602c6b97a78063a502ab379905c3f.png

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<

使用 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命令简介

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值