我正在为 Mac OS(Mountain Lion,Darwin 2050.22.13)构建一个自定义内核。我可以很好地构建内核,我可以向它添加东西,但我错过了一些东西。
为了简短起见,这里是我正在尝试做的一个示例。
假设我想添加一个函数 [my_func(void*)] 来表示,bsd/kern/kern_fork.c 我可以添加一个包含文件并将其粘贴到 osfmk/bsd 并更改 Makefile 以便新的 .h 文件现在被复制到 BUILD/obj/RELEASE_X86_64/EXPORT_HDRS/
我还将函数名称添加到 config/BSDKernel.exports。我可以在 /mach_kernel 中看到带有符号的函数,所以它看起来很好。
现在,这是棘手的部分。这本身并不棘手,但我无法弄清楚。我想要做的是能够从我也在编写的 kext 中调用我的函数。基本上它对我来说是某种私有 API。
我的 kext 编译得很好,但是当我运行 kextload/kextutil 时它抱怨它找不到 my_func 符号。
(内核)kxld[com.blah.foo.kext]:此kext无法解析以下符号(内核)kxld[com.blah.foo.kext]:_my_func
kextlibs 返回:对于所有架构:com.apple.kpi.libkern = 12.3
对于 x86_64:在任何库 kext 中都找不到 1 个符号
所以问题是如何使我的函数对我的 kext 可见?谢谢!