ZLD:进入,更快的Apple链接器版本

2021-06-06 07:51:34

对于大型项目,链接阶段(说明)可以显着增加增量构建时间。该项目是Apple Linker,LD的叉子。这是一个可以大大速度的替代品。

如果您发现链接的链接至少为40%,请随时提交问题(确保连续运行两次以确保已生成缓存)。这里可以在此处找到进一步的基准详细信息。

这一切都取决于您的风险容忍度以及您在增量构建时重视加速度的风险。当链接需要超过一秒钟时,i' d用这个新的链接器削减该时间一半。如果这种差异对你有引人注目的话,那么它就值得尝试。就个人而言,我在具有现有链接时间的项目中使用它甚至可以为500ms(但是我是一个不耐烦的迂腐器)。

ZLD从最近开放的LD版本中叉。在世界上许多最大的应用程序中,成千上万的开发人员使用了它'在哈希周围没有一些优化,它会将与开源源相同的可执行文件生成字节。虽然它并不理想的混合编译器和链接工具链版本,但开源是最近的。 ZLL将继续使用每个新版本的LD更新,因为它被发布。

获取zld的zld的路径,然后添加-fuse-ld =< zld> -wl,-zld_original_ld_path,$(dt_toolchain_dir)/ usr / bin / ld to"其他链接器标志"在构建设置(调试配置)中。那个-zld_original_ld_path提供链接器Xcode的路径将使用,否则将使用,这是重要的,因为存在某些已知的情况(例如ARM64_32和Catalyst),其中ZLD知道它具有问题,并且将默默地使用该链接器。修复这些情况是一项工作中的工作(大量阻止苹果缓慢释放源代码)。

请注意,您需要禁用Sandbox以便现在工作。此外,为了使链接动作可缓存,必须确定到ZLD的路径(例如,例如/ TMP / ZLD-09EA158,其中09EA158是ZLD版本)。

默认情况下,ZLD存储在/ TMP / ZLD -...中的某些元数据以加速。这是使ZLD成为真正增量链接器的第一步。目前,存储的唯一物品是对象文件和库名称。

Apple' S方法是一种非常合理的方法,使用具有STL数据结构的C ++。但是,有许多方法可以在其中筛选出来,例如:

围绕字符串的散列优化(使用更好的散列函数等缓存哈希函数等)

无论您是否使用此项目,还有许多可以加速链接的东西(再次,这仅用于调试版本):

链接器标志-wl,-random_uuid,它禁用基于内容散列的UUID创建,然后使用随机uuid(使用-no_uuid会在LLDB附加到二进制时降低性能)

对于可执行文件和XCTEST捆绑包,禁用DYLD导出与-wl,-exported_symbols_list,/ dev / null导出trie创建(无法通过为xctest提供符号的测试主机应用程序使用)

-wl,-no_deduplicate,禁用重复数据删除通过。在Xcode中,默认情况下添加此标志进行调试构建。

-wl,-no_compact_unwind,它禁用Compact Beakind Info的创建。请注意,如果在未展开的异常展开,则无需其紧凑的展开信息,已链接的Objective-C和C ++功能可能会崩溃,而不是继续展开。然而,SWIFT函数不受影响(即使Objective-C / C ++异常展开)。所以,它最适合纯粹的Swift项目。它也可以破坏崩溃报告。

-wl,-x,禁用将非全局符号放入符号表中。 只要仍然启用了调试信息,就会赢得' t影响调试。 为zld做出贡献的最大方法是提交问题! 如果您遇到任何问题,请随时提交问题,您可以预期响应提示。