【问题标题】:calling a function defined in assembly from swift从 swift 调用程序集中定义的函数
【发布时间】:2016-09-09 22:25:23
【问题描述】:

我知道在 swift 中可以使用 swift 模块中的函数上的@_silgen_name attr 与 c 进行互操作。有没有办法用程序集文件中定义的符号来做到这一点?我想使用 Swift 进行系统调用。这就是我问的原因。

【问题讨论】:

  • 编译后的目标文件不知道它是用 C 编译的,还是用汇编语言汇编的。
  • @PaulGriffiths 编译器在编译 swift 模块时如何知道 asm 文件中的符号在哪里?
  • 它知道符号在 C 源文件中的位置的方式完全相同 - 它在目标文件的符号表中查找它。
  • @PaulGriffiths 但我没有告诉编译器链接它。有什么特殊的标志需要我传入吗?
  • This question 可能会有所帮助。

标签: swift swift2


【解决方案1】:

创建bridge header.h 文件并将函数原型放入该文件中。

例如你的汇编代码:

.globl _add // make it global so that others can find this symbol
....
_add: // int add(int a, int b)
  movl %esi, %eax
  addl %edi, %eax
  ret

然后在桥接header.h文件中

int add(int a, int b);

在 swift 模块的顶部定义它

@_silgen_name("add") func add(a: Int32, b: Int32) -> Int32

然后你就可以快速使用它了:

let a = add(1, 2);

【讨论】:

  • 我应该将哪些标志传递给 swiftc 编译器以便它链接程序集文件?
  • 放同一个XCode项目就好了。
  • 然后试试这个swiftc -import-objc-header add.h app.swift add.o -o app 其中add.h 包含头文件,add.o 是编译的汇编代码。
  • 谢谢你,你知道谁来编译程序集,因为我似乎无法在铿锵声中找到任何标志来做到这一点。我试过clang -S -mllvm --x86-asm-syntax=intel add.s
  • 这是我尝试过的g++ -c main.s。你可以试试llvm-g++ -c main.s吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 2015-05-07
  • 2020-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多