在果壳中的二进制剥离

时间:2012-02-11 06:21:52

标签: iphone ios xcode binary stripping

有人可以向我解释二进制剥离吗?效果如何(它减少了多少二进制数)?你是如何申请的?

1 个答案:

答案 0 :(得分:8)

实际上有两种剥离方式。

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

符号表在程序崩溃时提供有用的调试信息,因此您可以获得一个回溯,显示程序崩溃时调用的函数。如果删除符号,则回溯将仅包含内存地址但不包含函数名称。您永远不应该删除正在调试的应用程序。

剥离二进制文件也使得对可执行文件进行反向工程变得稍微困难​​,但我希望你不是那种偏执狂。

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

您可以使用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