从 C 调用 Swift 4 方法

逆向工程 C 操作系统 虚拟机
2021-06-26 06:55:53

我之前已经能够使用 C 中的函数指针调用 Swift 方法,并提供适当的参数,因为调用约定是相同的。

不幸的是,这不再有效。这是因为 Swift 添加了一个“调用上下文”参数,该参数在与普通参数不同的寄存器 (r13) 中传递。对于常规方法调用,此上下文是指向 self 的指针。有关更多信息,请参见此处:https : //github.com/apple/swift/blob/master/docs/ABIStabilityManifesto.md#calling-convention

因此,为了调用这些方法,我需要能够可靠地将 r13 设置为来自 C 的适当值。

我怎样才能在 clang/llvm 中做到这一点?

我没有找到向特定寄存器声明寄存器变量的方法(gcc 语法对此不起作用)。所以我有这样的代码:

void (*my_fp)(void *) = find_pointer();
void *instance = find_instance();
void *arg1 = whatever();
asm {
    mov r13, [instance]
}
my_fp(arg1);

它可能会或可能不会工作 - 有时编译器会立即将 r13 用于函数指针。此外,我想在未经编译器同意的情况下仅写入该寄存器并不是特别安全。

有没有可靠的方法来做到这一点?

(顺便说一句,我无法在我的代码中包含 Swift 运行时,所以我必须能够从 C 调用。)

1个回答

一个好的“半官方”方法可以在这里找到:

https://forums.swift.org/t/best-way-to-call-a-swift-function-from-c/9829/3

(Quinn 是迄今为止最好的苹果程序员):)