是否有任何迹象表明哪些Apple平台允许内联汇编?

时间:2015-11-12 20:01:30

标签: ios xcode assembly watchkit tvos

自从苹果宣布推出bitcode之后,我一直在尝试decypher一段时间以来各种平台上的内联汇编的状态。

到现在(Xcode 7.1.1)这是我观察到的:

  • OSX - 允许(我希望永远)
  • iOS - 允许,即使使用bitcode(内联汇编放入bitcode)with probable confirmation
  • watchOS - 不允许(不会编译,禁止内联汇编错误)
  • tvOS - 允许

然而,这些都是可疑的结论,因为我没有在每个市场上都有应用来验证这一点。

我看到一些来自开源库和应用的帖子,当包含内联汇编 bitcode时,iOS应用将被拒绝。我看过一些帖子,tvOS与watchOS类似,不会让你使用内联汇编(也许在最新的Xcode中修复?)

Apple是否有一些可靠的参考资料或者..在任何地方我都可以使用内联汇编?

1 个答案:

答案 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位可执行文件要简单得多。