【问题标题】:Is there any indication as to which Apple platforms allow inline assembly?是否有任何迹象表明哪些 Apple 平台允许内联汇编?
【发布时间】:2016-02-14 07:11:42
【问题描述】:

自从 Apple 宣布 bitcode 以来,我一直在尝试解密各种平台上的内联汇编的状态。

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

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

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

我看到一些来自开源库和应用程序的帖子说,iOS 应用程序在包含内联汇编位代码时会被拒绝。我看过一些帖子说 tvOS 与 watchOS 类似,不会让你使用内联汇编(可能在最新的 Xcode 中修复?)

是否有来自 Apple 的可靠参考或.. 关于我可以在哪些平台上使用内联汇编的任何地方?

【问题讨论】:

    标签: ios xcode assembly watchkit tvos


    【解决方案1】:

    在任何 ARM 平台(iOS、watchOS、tvOS)上,如果您提供混合的 bitcode/asm 存档,它只能(请参阅下面的详细信息)编译为与嵌入式 asm 相同的架构。这意味着您也可以提交针对该架构的完整二进制应用程序 - 提交位码绝对没有优势(因此 Apple 没有理由允许它)。

    根据Apple docs,watchOS 和 tvOS 需要位码 - 因此内联汇编被禁用。

    注意:对于 iOS 应用程序,位码是默认设置,但可选。对于 watchOS 和 tvOS 应用程序,需要位码。如果您提供位码,所有应用程序 和应用程序包中的框架(项目中的所有目标)需要 包括位码。使用 iTunes Connect 分发应用程序后, 您可以下载构建的 dSYMs 文件,如查看中所述 并在设备窗口中导入崩溃。

    On X86,包含位码和 X86 ASM 混合的存档可以编译成 64 位应用程序。显然这是一件明智的事情,因为可能手工制作的汇编器是性能关键部分 - 但它可以工作。

    在 ARM 上情况并非如此。 X86 案例之所以有效,是因为 X86 指令集是 X86_64 的纯子集,这意味着任何 X86 汇编器都是有效的 X86_64 汇编器。在 ARM 上,64 位处理器需要在 32 位状态下运行才能执行 32 位代码。根据ARM docs,您不能在同一应用程序中混合使用 32 位和 64 位程序集(请参阅更改执行状态)

    ...实际上,这意味着您不能拥有混合的 32 位和 64 位应用程序,因为它们之间没有直接的调用方式。

    这意味着,如果您提供针对 ARM 架构 ARCH 的 bitcode 和内联 asm 的混合,实际上 AppStore 唯一能做的事情(至少目前)就是为 ARCH 编译您的 bitcode,这给您(比如说)一个在 64 位处理器上运行的完全 32 位应用程序。重点是什么?首先上传一个没有位码的普通 32 位可执行文件会简单得多。

    【讨论】:

    • 我想我明白你想说什么,但“反汇编源代码”一清二楚。反汇编是将目标代码转换为汇编代码的过程。您可能需要编辑该部分以澄清。
    • 这不是真的,内联汇编完全可以放入 LLVM IR 中,因此也可以放入 Apple 的位码中。尝试将一些内联汇编放入程序中,并查看带有 -S -emit-llvm.. 的 clang 输出。它最终看起来类似于 call void asm sideeffect "nop", "~{dirflag},~{fpsr},~{flags}"() #2, !srcloc !2
    • @Earlz - 谢谢你的例子,但正如你所看到的,它仍然嵌入内联汇编,而不是将其转换回 100% 位码,这是苹果希望你使用的。不过我看我回复的第一行意思有点含糊,我会改的。
    • @AirsourceLtd:关键是,拥有一些内联 asm 的 sn-ps 并不能阻止为新的指令集扩展重新生成应用程序的其余部分。就像用 -march=native 编译使用内联汇编的 C 源代码一样,内联汇编部分将保持不变,但其他一切都可能受益。因此,在几乎所有代码都是不是内联汇编的典型情况下,这很好,并且新的指令集扩展并没有比内联汇编做得更好。
    • @PeterCordes - 但如果你这样做了,AppStore 怎么知道你提供的内容实际上适用于所有处理器?如果你提供了无法在 ARM64 上运行的 ARM32 代码,那么会发生什么?每次进入和退出代码块时都转储缓存并切换执行模式?内联汇编的重点是性能。仅当您可以为不同的架构选择不同的代码块时,才能使您的应用程序的一部分依赖于架构而其余的架构独立于架构 - 而您不...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 2021-07-13
    • 2013-04-29
    • 2010-10-20
    • 2019-08-24
    • 2014-05-25
    相关资源
    最近更新 更多