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

最佳答案

实际上有两种剥离。

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

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

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

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

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

关于iphone - 简而言之,二进制剥离,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9238313/

10-09 10:20