在果壳中的二进制剥离

the*_*ser 3 iphone binary xcode stripping ios

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

Die*_*Epp 8

实际上有两种剥离方式.

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

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

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

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

您可以使用该strip命令从命令行中删除二进制文件.我不太确定如何从Xcode触发这个.

strip MyExecutable
Run Code Online (Sandbox Code Playgroud)

死剥离是一个不同的过程,它会从代码中删除未使用的函数和数据.这在链接阶段发生,当创建二进制文件时.这可能会减少代码的大小.差异将取决于程序中未使用的数据量; 它可能很多,而且可能一点也不.死剥离可以使您的应用程序更快一点,因为它增加了热代码的位置.(如果它有很大的不同,那么您的应用程序就会出现严重问题.)

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

gcc -o MyExecutable -Wl,-dead_strip ....
Run Code Online (Sandbox Code Playgroud)

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

参考文献:

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