我有一个汇编文件需要使用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
..
正如您所看到的,f函数在这里并标有'T',这意味着它是一个全局函数。但kextload似乎无法解决它。
答案 0 :(得分:2)
这是由于Name Mangling,导致名称f
变为__Z9fy
。您有两种选择之一:
extern "C"
__Z9fy
第一个选项几乎总是首选路径,因为它更加跨平台(它不依赖于C ++名称修改的细节),并保持符号名称“干净”。