iOS armv7 : How to slice a (too) large object prior to linking

标签 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 被证明是不可靠的)

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

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

最佳答案

我们刚刚在我们当前的一个 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 中,这些代码在 Xcode 构建阶段将以“.o 文件”结尾),也许您可​​以要求引导镜像生成器开发人员拆分他们的代码代码。
  3. 有关优化 (C#/Unity) 的更多具体提示,请参阅以下帖子,不知道这是否适用于您。 http://forum.unity3d.com/threads/unity-ios-linker-error-unable-to-insert-branch-island-no-insertion-point-available.239200/

根据架构/设置,限制似乎是 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

关于iOS armv7 : How to slice a (too) large object prior to linking,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24971959/

相关文章:

objective-c - UITableView 上的自定义滚动绘图层

iphone - beginAnimations方法中的animationID列表

swift - 如何使用来自 UIView 单元格的 firebase 用户名重命名不同 View Controller 中的按钮?

xcode - 如何将 Box2d 添加到现有的 Xcode/Cocos2d 项目

c++ - 获取对 std::thread::_M_start_thread 的 undefined reference

ios - iOS/移动版 safari 与现代浏览器标准的符合程度如何?

ios - 使用 iOS7 的 Swift ISO-8601 日期格式

xcode - 为什么我的计时器在 Swift 中不倒计时到 0?

linux - 无法将库目录添加到 ld

c - 为数据重用代码内存