首页 > 解决方案 > 对于非常大的应用程序,如何修复因“ARM64 分支超出范围”而失败的构建?

问题描述

我们无法在优化级别设置为“无”的 Xcode 中构建我们的 iOS 应用程序:

在此处输入图像描述

Xcode 在链接器阶段给出错误:

ld: b(l) ARM64 branch out of range (138312952 max is +/-128MB): from _main (0x100006F10) to __Unwind_Resume@0x00000000 (0x1083EED14) in '_main' from /Users/user/Library/Developer/Xcode/DerivedData/OurApp-banhncbunovfpngtiwyxnvvokvnc/Build/Intermediates.noindex/OurApp.build/ReleaseForRunning-iphoneos/OurApp.build/Objects-normal/arm64/main.o    

我们认为这是因为我们的二进制文件太大了。
我们可以将优化级别设置为最快、最小:

在此处输入图像描述

但是我们不能在断点处调试和停止——它们被这个优化级别打破了。

使用“最快、最小”,我们的二进制文件大小约为 660 MB。
我们认为“无”优化级别二进制大小超过了一些 clang/ld 限制,这导致

ARM64 branch out of range

错误。

我们现在不能轻易地从我们的项目中删除大量代码。即使我们这样做了,我们的代码库也会增长得非常快。
所以即使我们现在删除一些代码,问题很快就会再次出现。
我们试图在 clang/ld 中寻找一个扩大最大文件大小的选项,但找不到它。

我们还发现我们的临时构建版本的二进制文件大小要小得多——大约 230 MB。
我们认为这与 Xcode 用于调试构建的调试信息有关。

有没有办法再次在 Xcode 中进行调试构建?
可能是 Xcode/clang/ld 中的某些设置会更改二进制文件大小限制。
或者也许是另一种(更紧凑的)调试信息格式,以使我们的调试二进制文件更小。

更新 1:
我们发现,当将 Build Active Architecture Only 设置为 YES 时,我们可以在非 64 位设备上运行。但是这些设备对我们的应用程序来说非常弱,我们无法调试我们想要的所有功能 - 在我们调试之前设备因内存不足而崩溃。

更新 2:
Xcode 不允许在支持 64 位的设备上运行仅 armv7 的应用程序。如果有人知道在 64 位设备上运行 armv7-only 构建的方法,请分享。这样的解决方案将适合我们 - 我们将构建 armv7-only 构建,它比 armv7+arm64 构建小得多。

标签: xcodedebugginglinkerclang

解决方案


推荐阅读