实际上有两种剥离方式.
剥离二进制文件会从二进制符号表中删除不需要的符号.符号表包含程序中每个对象的名称以及调试信息.这对于程序运行不是必需的,因为程序通常不通过符号表访问它们自己的函数.
当程序崩溃时,符号表提供有用的调试信息,因此您可以获得回溯,显示程序崩溃时调用的函数.如果删除符号,则回溯将仅包含内存地址但不包含函数名称.您永远不应该删除正在调试的应用程序.
剥离二进制文件也使得对可执行文件进行逆向工程略微困难,但我希望你不是那种偏执狂.
剥离二进制文件不会使程序加载更快.除非程序崩溃,否则符号表将不会加载到内存中,除非需要进行回溯.
您可以使用该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总是在其汇编输出中生成该指令.
参考文献:
| 归档时间: |
|
| 查看次数: |
2353 次 |
| 最近记录: |