3

有人可以向我解释二进制剥离吗?它有多有效(它减少了多少二进制文件)?你如何应用它?

4

1 回答 1

9

实际上有两种剥离方式。

剥离二进制文件会从二进制文件的符号表中删除不需要的符号。符号表包含程序中每个对象的名称以及调试信息。这对于您的程序运行来说不是必需的,因为程序通常不会通过符号表访问它们自己的函数。

符号表在程序崩溃时提供有用的调试信息,因此您可以获得回溯,显示程序崩溃时调用了哪些函数。如果去掉符号,回溯将只包含内存地址,但不包含函数名。您永远不应该剥离正在调试的应用程序。

剥离二进制文件也会使对可执行文件进行逆向工程变得稍微困难​​一些,但我希望你不要那么偏执。

剥离二进制文件不会使您的程序加载速度更快。除非程序崩溃时需要回溯,否则符号表不会加载到内存中。

您可以使用该strip命令从命令行剥离二进制文件。我不太确定如何从 Xcode 触发它。

strip MyExecutable

死区剥离是一个不同的过程,它从代码中删除未使用的函数和数据。这发生在链接阶段,即创建二进制文件时。这可能会减少代码的大小。差异取决于程序中有多少未使用的数据;它可能很多,也可能什么都不是。死区剥离可以使您的应用程序稍微快一些,因为它增加了热代码的局部性。(如果它有很大的不同,那么您的应用程序就存在严重问题。)

死剥离没有一般的缺点,所以我总是打开它。您可以通过 Xcode 启用死区剥离,它对应于链接器标志-dead_strip

gcc -o MyExecutable -Wl,-dead_strip ....

注意:死剥离通过将每个函数放在单独的小节中来工作。如果您编写汇编文件,您可以使用该.subsections_via_symbols指令将每个符号放在单独的小节中,从而允许链接器将各个符号直接剥离。据我所知,GCC 总是在其汇编输出中生成该指令。

参考:

https://developer.apple.com/library/mac/#documentation/General/Conceptual/MOSXAppProgrammingGuide/Performance/Performance.html

于 2012-02-11T07:14:42.390 回答