"strip"(GCC应用程序)是用于什么的?

31
这个小应用程序是干什么用的?
在不加任何选项的情况下使用它可以减小可执行文件的大小,但是它是如何做到的?
3个回答

31

来自(Mac OS X,但其他操作系统类似)man页面

strip 命令用于删除或修改附加到汇编器和链接编辑器输出的符号表。这对于在程序调试完成后节省空间并限制动态绑定符号非常有用。

请注意“程序调试完成后”的部分,因为调试已经剥离的可执行文件是非常困难的。 “限制动态绑定符号”是一个较少使用的功能:它允许您通过去除告知实际代码位置的索引条目来使外部库中的某些函数不可访问。这也在man页面中解释过了。

尽管大多数情况下磁盘都很便宜且富足,您可能还是希望用于空间受限的情况,例如嵌入式设备,救援磁盘等。


26
只要你保留未经剥离的可执行副本,就可以自由地发布已剥离版本并在需要时对未剥离版本进行调试。例如,在嵌入式开发中,如果从现场收到一个核心文件(来自客户运行已剥离二进制文件),则可以将未剥离的二进制文件加载到gdb中,然后打开核心文件以进行完整的符号调试。 - Dan Moulding
19
虽然硬盘空间很便宜,但硬盘性能却不是。二进制文件越小,在加载应用程序/库时需要执行的磁盘I/O就越少。 - Isak Savo
4
我同意。庞大的程序会让我的性能不错的电脑变得异常缓慢。程序员们啊!小巧玲珑才是美!话说,导致加载缓慢的另一个原因是库的碎片化。它们被碎片化以使它们更细粒度,避免 - 哈哈 - 不必要的加载。在快速随机访问 SSD 时代,这并不那么重要。 - spraff
2
另外一个剥离符号的好处是,它使得黑客的工作更加困难(至少对于C++而言,对于Java或Objective-C这样的反射语言帮助不大)。 - BadPirate
@isak-savo 至少就静态符号表而言,我在这里读到(https://dev59.com/lXM_5IYBdhLWcg3wgja2#19564329)说它不会被加载到内存中。这正确吗? - starball

8

它会从二进制文件中去除符号信息。二进制文件包含将符号(例如函数名)映射到特定位置的一些信息。strip 会删除这些信息。


4

默认情况下,strip命令会从可执行文件中删除符号表和任何调试信息。

来自这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接