iOS armv7:如何在链接之前对(太)大的对象进行切片

iOS armv7:如何在链接之前对(太)大的对象进行切片,ios,xcode,ld,Ios,Xcode,Ld,我有一个特别棘手的ld问题:我正在生成一个大的对象文件(一个“启动映像”,仅限armv7),它后来被一个Xcode项目使用 无论引导映像.o有多大,它总是成功创建的。但是,在构建Xcode项目时,Xcode稍后会失败,原因是: ld: Unable to insert branch island. No insertion point available. for architecture armv7 在这一点上有几件事需要提及: 我没有办法影响这个启动映像文件是如何生成的。这意味着我无法影

我有一个特别棘手的ld问题:我正在生成一个大的对象文件(一个“启动映像”,仅限armv7),它后来被一个Xcode项目使用

无论引导映像.o有多大,它总是成功创建的。但是,在构建Xcode项目时,Xcode稍后会失败,原因是:

ld: Unable to insert branch island. No insertion point available. for architecture armv7
在这一点上有几件事需要提及:

  • 我没有办法影响这个启动映像文件是如何生成的。这意味着我无法影响创建多个启动映像
  • 我知道这个错误是从哪里来的[1]。当启动映像在16+MB左右时就会发生这种情况
  • 我正在研究使用链接时间优化,但有人告诉我,对于这个引导映像生成器,这不是一个好主意(因为这个引导映像生成器的作者尝试了这个方法,并说LTO不可靠)
考虑到上述情况,我认为我唯一的选择是在使用Xcode构建之前,以某种方式将我的引导映像.o分割成几个对象。但是怎么做呢


[1]

我们在当前的一个Unity 3D项目中遇到了同样的问题。这似乎是唯一的选择,降低“太大的”.o文件的大小

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

  • 去除调试符号(生成选项),因为调试符号会大量增加.o文件
  • 将代码拆分为更多文件(在Unity中,您可以在多个DLL中预编译代码,在Xcode构建阶段,这些DLL最终将在“.o文件”中完成),可能您可以要求引导映像生成器开发人员拆分代码
  • 有关优化(C#/Unity)的更多具体提示,请参见下面的帖子,不知道这是否适用于您。
  • 根据架构/设置,限制似乎是14MB或30MB。 另见此处:

    这些是第一件要尝试的事情。但我总的来说遇到了这个问题,我需要一个通用的解决方案。我项目的背景是,大型.o文件是巨大的二进制(-c-)对象文件,它们是从已经精简的Java.jar文件(我在iOS上使用一个小型JVM)生成的。我认为除了将大型源文件/库拆分为较小的源文件/库之外,没有其他选择。但是如果你找到了,请告诉我;-)