问题 - kextload链接(与.a文件链接)

时间:2014-07-28 11:51:54

标签: xcode macos kernel static-libraries nasm

我有一个汇编文件需要使用Xcode与内核驱动程序链接。 为此,我使用'ar rc'命令创建一个.a文件并将其添加到我的Xcode项目@'使用库链接二进制文件'。构建成功。我有一个全局函数(在我的汇编文件中)名为f,我从一个cpp文件中调用它,该文件具有此函数的前向声明。

// bar.cpp
void f();
...
f();

函数的定义位于前面提到的asm文件中:

global _f
_f:
...
ret

当我尝试使用'kextload'执行kext时,我收到以下错误:

(kernel) kxld[com.apple.dts.driver.SimpleDriver]: The following symbols are unresolved for this kext:
(kernel) kxld[com.apple.dts.driver.SimpleDriver]:   __Z9fy <---- that is probably the function f
(kernel) Can't load kext com.apple.dts.driver.SimpleDriver - link failed.
(kernel) Failed to load executable for kext com.apple.dts.driver.SimpleDriver.
(kernel) Kext com.apple.dts.driver.SimpleDriver failed to load (0xdc008016).
(kernel) Failed to load kext com.apple.dts.driver.SimpleDriver (error 0xdc008016).
Failed to load SimpleDriver.kext - (libkern/kext) link error.

当我在之前创建的.a文件中使用'nm'命令时,我收到以下输出:

..
00000000000002e9 t somefunction
0000000000000119 t somefunction
0000000000000242 t somefunction
0000000000000293 T f
0000000000000006 t somefunction
00000000000003cf t somefunction
..
  • 'somefunction'一词用于对问题不重要的函数 -

正如您所看到的,f函数在这里并标有'T',这意味着它是一个全局函数。但kextload似乎无法解决它。

1 个答案:

答案 0 :(得分:2)

这是由于Name Mangling,导致名称f变为__Z9fy。您有两种选择之一:

  1. 使用extern "C"
  2. 作为C ++声明的前缀
  3. 将程序集函数命名为__Z9fy
  4. 第一个选项几乎总是首选路径,因为它更加跨平台(它不依赖于C ++名称修改的细节),并保持符号名称“干净”。