返回

解决 iOS 14.2 libffi 崩溃问题:黑科技一招搞定

IOS

解锁黑科技:一招解决 iOS 14.2 的 libffi 崩溃问题

在 iOS 14.2 系统中,libffi 组件中出现了一个恼人的崩溃问题,让开发者们头疼不已。这个崩溃问题是由 vmremap 导致的代码签名错误造成的,给 app 的稳定性带来了威胁。然而,现在有一个黑科技解决方案,可以轻松搞定这个棘手的问题。

黑科技原理:引入静态 trampoline

苹果提供了 libffi 组件,它是一个用于执行原生函数的接口库。在 iOS 14.2 系统中,vmremap 是负责动态内存重新映射的组件。然而,当 vmremap 被用于 libffi 时,它会导致代码签名验证失败,从而触发崩溃。

为了解决这个问题,我们引入了一种名为静态 trampoline 的技术。静态 trampoline 是一种预先编译好的代码片段,它位于应用程序的可执行文件中。当 libffi 需要执行原生函数时,它将使用静态 trampoline 而不是 vmremap。通过这种方式,我们就绕过了 vmremap 的代码签名验证,从而解决了崩溃问题。

实现步骤:

  1. 创建静态 trampoline

创建一个包含以下汇编代码的静态 trampoline 汇编文件:

.text
.align 4
.global trampoline
trampoline:
    mov x0, x1
    mov x1, x2
    mov x2, x3
    mov x3, x4
    mov x4, x5
    mov x5, x6
    mov x6, x7
    mov x7, x8
    blx x0
    mov x0, x0
    mov x1, x1
    mov x2, x2
    mov x3, x3
    mov x4, x4
    mov x5, x5
    mov x6, x6
    mov x7, x7
    ret
  1. 汇编 trampoline 文件

使用汇编器(例如 Apple 的 gas)汇编 trampoline 文件,生成 trampoline 的二进制表示:

gas -c trampoline.s
  1. 将 trampoline 二进制文件嵌入应用程序

使用以下命令将生成的 trampoline 二进制文件嵌入到应用程序的可执行文件中:

lipo -create -output embedded_trampoline.bin trampoline.o
  1. 更新 libffi

修改应用程序中 libffi 的源代码,使用嵌入的 trampoline 而不是 vmremap:

#include "embedded_trampoline.h"

static void *
trampoline(void *ctx, void *func, void *args)
{
    return trampoline(func, args);
}

优势:

  • 解决崩溃问题: 静态 trampoline 消除了 vmremap 引起的代码签名验证失败,从而解决了 libffi 崩溃问题。
  • 提高稳定性: 修复了崩溃问题,提高了应用程序的稳定性和可靠性。
  • 简单易行: 实现静态 trampoline 的过程相对简单,并且不需要对应用程序进行重大修改。

总结:

通过使用静态 trampoline,我们能够解决 iOS 14.2 系统中 libffi 崩溃的问题。这种黑科技解决方案简单有效,可以轻松提高应用程序的稳定性。告别 libffi 的崩溃烦恼,尽情享受流畅的 iOS 体验吧!

SEO信息