xcode 简而言之二进制剥离

e1xvtsh3  于 2023-04-13  发布在  其他
关注(0)|答案(1)|浏览(145)

有人能给我解释一下二进制剥离吗?它有多有效(它能减少多少二进制)?你是如何应用它的?

nxowjjhe

nxowjjhe1#

实际上有两种剥离。

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

当程序崩溃时,符号表提供有用的调试信息,因此您可以获得一个回溯跟踪,显示程序崩溃时调用了哪些函数。如果去掉符号,回溯跟踪将只包含内存地址,而不包含函数名。您永远不应该去掉正在调试的应用程序。
剥离二进制文件也会使对可执行文件进行反向工程变得稍微困难一些,但我希望您不要那么偏执。
剥离二进制文件并不会使程序加载得更快。符号表不会加载到内存中,除非在程序崩溃时需要进行回溯。
你可以使用strip命令从命令行剥离二进制文件。我不太清楚如何从Xcode触发它。

strip MyExecutable

Dead stripping是一个不同的过程,它从你的代码中删除不用的函数和数据。这发生在链接阶段,当二进制文件被创建时。这可以减少你的代码的大小。区别将取决于你的程序中有多少不用的数据;死剥离可以使你的应用程序稍微快一点,因为它增加了热代码的局部性。(如果它有很大的不同,那么你的应用程序有严重的问题。)

dead stripping没有一般的缺点,所以我总是打开它。你可以通过Xcode启用dead stripping,它对应于链接器标志-dead_strip

gcc -o MyExecutable -Wl,-dead_strip ....

**注意:**Dead stripping的工作原理是将每个函数放在一个单独的子部分中。如果你编写汇编文件,你可以使用.subsections_via_symbols指令将每个符号放在一个单独的子部分中,允许链接器对单个符号进行dead stripping。据我所知,GCC总是在其汇编输出中生成该指令。
参考文献:

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

相关问题