【问题标题】:Binary Stripping in a Nutshell二进制剥离简而言之
【发布时间】:2012-02-11 06:21:52
【问题描述】:

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

【问题讨论】:

    标签: iphone ios xcode binary stripping


    【解决方案1】:

    剥离其实有两种。

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

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

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

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

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

    strip MyExecutable
    

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

    死剥离没有一般的缺点,所以我会一直打开它。您可以通过 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

    【讨论】:

    • 所以死剥离会删除总文件大小?
    • 只有在编写从不调用的函数或从不使用的数据时才会减小文件大小。差异可能非常小,可能为零,也可能非常大。这取决于您的应用程序。它还会影响加载时间和运行时性能,但影响很小(太小而无法注意到)。
    • 嗯,这些设置似乎是在发布配置中为您预先设置的。所以我将无法优化任何东西。哦,好吧,还是谢谢。另外,既然你知识渊博,你能帮忙吗? stackoverflow.com/questions/9230550/…
    • 要在 Xcode 中启用符号剥离,您必须设置以下构建设置:部署后处理 [是]、剥离链接产品 [是]、剥离样式 [所有符号]。
    猜你喜欢
    • 2014-05-06
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 2013-04-05
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    相关资源
    最近更新 更多