【发布时间】:2012-02-11 06:21:52
【问题描述】:
有人可以向我解释二进制剥离吗?它有多有效(它减少了多少二进制文件)?你是怎么应用的?
【问题讨论】:
标签: iphone ios xcode binary stripping
有人可以向我解释二进制剥离吗?它有多有效(它减少了多少二进制文件)?你是怎么应用的?
【问题讨论】:
标签: iphone ios xcode binary stripping
剥离其实有两种。
剥离二进制文件会从二进制文件的符号表中删除不需要的符号。符号表包含程序中每个对象的名称以及调试信息。这不是您的程序运行所必需的,因为程序通常不通过符号表访问它们自己的函数。
符号表在程序崩溃时提供有用的调试信息,因此您可以获得回溯,显示程序崩溃时调用了哪些函数。如果去掉符号,回溯将只包含内存地址,但不包含函数名称。永远不要剥离正在调试的应用程序。
剥离二进制文件也会使对可执行文件进行逆向工程稍微困难一些,但我希望你不要那么偏执。
剥离二进制文件不会使您的程序加载得更快。除非您的程序崩溃时需要回溯,否则符号表不会加载到内存中。
您可以使用strip 命令从命令行剥离二进制文件。我不太确定如何从 Xcode 触发它。
strip MyExecutable
Dead stripping 是一个不同的过程,它从您的代码中删除未使用的函数和数据。这发生在链接阶段,即创建二进制文件时。这可能会减少代码的大小。差异取决于程序中有多少未使用的数据;它可能很多,也可能什么都不是。死区剥离可以使您的应用程序稍微快一些,因为它增加了热代码的局部性。 (如果影响很大,则说明您的应用程序存在严重问题。)
死剥离没有一般的缺点,所以我会一直打开它。您可以通过 Xcode 启用死剥离,它对应于链接器标志-dead_strip。
gcc -o MyExecutable -Wl,-dead_strip ....
注意:死区剥离通过将每个函数放在单独的小节中来工作。如果您编写汇编文件,您可以使用.subsections_via_symbols 指令将每个符号放在单独的小节中,从而允许链接器将单个符号删除。据我所知,GCC 总是在其汇编输出中生成该指令。
参考资料:
【讨论】: