自从苹果宣布推出bitcode之后,我一直在尝试decypher一段时间以来各种平台上的内联汇编的状态。
从到现在(Xcode 7.1.1)这是我观察到的:
然而,这些都是可疑的结论,因为我没有在每个市场上都有应用来验证这一点。
我看到一些来自开源库和应用的帖子,当包含内联汇编和 bitcode时,iOS应用将被拒绝。我看过一些帖子,tvOS与watchOS类似,不会让你使用内联汇编(也许在最新的Xcode中修复?)
Apple是否有一些可靠的参考资料或者..在任何地方我都可以使用内联汇编?
答案 0 :(得分:8)
在任何ARM平台(iOS,watchOS,tvOS)上,如果您提供混合bitcode / asm存档,它只能(见下面的详细信息)编译为与嵌入式asm相同的体系结构。这意味着您也可以提交针对该体系结构的完整二进制应用程序 - 提交bitcode绝对没有优势(因此Apple没有理由允许它)。
根据Apple docs,watchOS和tvOS需要bitcode - 因此禁用内联汇编。
注意:对于iOS应用,bitcode是默认设置,但是可选。对于watchOS 和tvOS应用程序,bitcode是必需的。如果您提供bitcode,所有应用程序 应用程序包中的框架(项目中的所有目标)都需要 包括bitcode。使用iTunes Connect分发应用程序后, 您可以下载构建的dSYMs文件,如“查看”中所述 并在“设备”窗口中导入崩溃。
On X86,包含bitcode和X86 ASM混合的存档可以编译成64位应用程序。这并不明显,这是一个明智的事情,因为大概是手工制作的汇编程序是性能关键部分 - 但它可以工作。
在ARM上也是如此。 X86案例有效,因为X86指令集是X86_64的纯子集,这意味着任何X86汇编器都是有效的X86_64汇编器。在ARM上,64位处理器需要以32位状态运行才能执行32位代码。根据{{3}},您不能在同一应用程序中混合使用32位和64位程序集(请参阅更改执行状态)
......实际上,这意味着您不能拥有混合的32位和64位应用程序,因为它们之间没有直接的调用方式。
这意味着如果你提供bitcode和inline asm混合使用ARM体系结构ARCH,实际上AppStore唯一可以做的事情(至少目前)是编译你的bitcode for ARCH,它给你(比如说)a在64位处理器上运行的完全32位应用程序。重点是什么?首先上传一个没有bitcode的普通32位可执行文件要简单得多。