iOS armv7:如何在链接之前切割(太)大对象

时间:2014-07-26 14:18:59

标签: ios xcode ld

我有一个特别讨厌的ld问题:我正在生成一个大型目标文件(一个“启动映像”,仅限armv7),后来被Xcode项目使用。

无论它有多大,都会成功创建boot-image.o.但是,在构建Xcode项目时,Xcode后来失败了:

ld: Unable to insert branch island. No insertion point available. for architecture armv7

此时要提几点:

  • 我无法影响如何生成此启动映像文件。意思是我无法影响创建多个这些启动映像。
  • 我知道这个错误来自[1]。当引导映像大约在16+ MB标记
  • 时会发生这种情况
  • 我正在考虑使用链接时间优化,但被告知对于这个启动图像生成器,这不是一个好主意(因为这个启动图像生成器的作者试过并说LTO被证明是不可靠的)

考虑到上述情况,我认为我唯一的选择是在使用Xcode构建之前以某种方式将我的boot-image.o分割成几个对象。但是如何?

[1] http://docs.unity3d.com/412/Documentation/Manual/TroubleShooting.html

1 个答案:

答案 0 :(得分:1)

我们刚刚在一个当前的Unity 3D项目中遇到了同样的问题。它似乎是唯一的选择,以获得"太大" .o文件下来。

您可以尝试以下方法(帮助我们很多):

  1. 剥离调试符号(构建选项),因为调试符号可以大量增加.o文件。 https://developer.apple.com/library/ios/qa/qa1795/_index.html#//apple_ref/doc/uid/DTS40014195-CH1-BUILD_SETTINGS
  2. 将代码拆分为更多文件(在Unity中,您可以在多个dll中预编译代码,最终会在" .o文件"在Xcode构建阶段),可能是您可以询问启动映像生成器开发人员用于拆分代码。
  3. 有关优化(C#/ Unity)的更具体提示,请参阅以下帖子,不知道这是否适用于您。 http://forum.unity3d.com/threads/unity-ios-linker-error-unable-to-insert-branch-island-no-insertion-point-available.239200/
  4. 根据架构/设置,限制似乎为14MB或30MB。 另见: http://www.opensource.apple.com/source/ld64/ld64-133.3/src/ld/passes/branch_island.cpp http://forum.unity3d.com/threads/unable-to-debug-on-device-ld-unable-to-insert-branch-island.148563/#post-1841860