【问题标题】:Issue - kextload linking (Linking with .a file)问题 - kextload 链接(与 .a 文件链接)
【发布时间】:2014-07-28 11:51:53
【问题描述】:

我有一个需要使用 Xcode 与内核驱动程序链接的程序集文件。 为此,我使用 'ar rc' 命令制作了一个 .a 文件并将其添加到我的 Xcode 项目 @'Link binary with libraries'。构建成功。我有一个名为 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 似乎仍然无法解决它。

【问题讨论】:

    标签: xcode macos kernel static-libraries nasm


    【解决方案1】:

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

    1. 在 C++ 声明前加上 extern "C"
    2. 将汇编函数命名为__Z9fy

    第一个选项几乎总是首选路线,因为它更跨平台(它不依赖于 C++ 名称修饰的细节),并保持符号名称“干净”。

    【讨论】:

    • 没错,但是,鉴于这是他正在尝试构建的 kext,跨平台可能不符合他的兴趣
    猜你喜欢
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多