1

我正在为 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 可见?谢谢!

4

2 回答 2

1

多亏了 pmjordan,我才能让它工作。费了些力气,但现在看来还不错。

OSBundleLibraries 现在看起来像这样:

<key>OSBundleLibraries</key> 
    <dict> 
        <key>com.apple.kpi.libkern</key> 
        <string>12.3</string> 
        <key>com.apple.kpi.bsd</key> 
        <string>12.3</string> 
     </dict>

GCC 命令如下所示:

cc -m64 -Xlinker -kext -static -c foo.c -o Contents/MacOS/foo -fno-builtin -nostdlib -lkmod -r -mlong-branch -I/System/Library/Frameworks/Kernel.Framework/Headers -Wall

在 config/BSDKernel.exports 中:_my_func

在 osfmk/bsd 中,我有 bdsfoo.h [它有一个 extern int my_func(void) ]

构建内核:

make ARCH_CONFIGS=X86_64 KERNEL_CONFIGS=RELEASE VERBOSE=YES

一旦 mach_kernel 被复制到 /

cp BUILD/obj/RELEASE_X86_64/BSDKernel.symbolset /System/Library/Extensions/System.kext/PlugIns/BSDKernel.kext/BSDKernel

这是缺少的链接,再次感谢 pmjordan

重启。构建我的 kext 和 kextload,成功!

于 2013-07-19T01:32:59.997 回答
1

我相信这些符号BSDKernel.exports最终会出现在com.apple.kpi.bsdKPI 中,因此您需要将其添加到OSBundleLibrarieskext 的 info.plist 中的字典中。我不能 100% 确定这就是您需要做的全部,所以如果这不起作用,请告诉我们。

更新:

内置 KPI 实际上由 System.kext 的“插件”目录中的伪 kext 表示。那么对于 BSDKernel KPI 来说,这/System/Library/Extensions/System.kext/PlugIns/BSDKernel.kext/也许需要实物更新?

make all似乎不会自动构建一个新的System.kext. 但是,有很大一部分专门用于 System.kext config/Makefile,它似乎是安装目标的一部分。make install可能会成功。或者,如果您对此持谨慎态度(就像我一样),这似乎是关键线:

    install $(INSTALL_FLAGS) $(OBJROOT)/BSDKernel.symbolset    $(DSTROOT)/$(INSTALL_KEXT_DIR)/System.kext/PlugIns/BSDKernel.kext/BSDKernel;         \

换句话说,备份您的 System.kext,然后复制BUILD/obj/RELEASE_X86_64/BSDKernel.symbolset/System/Library/Extensions/System.kext/PlugIns/BSDKernel.kext/BSDKernel尝试引导。

祝你好运!

于 2013-07-17T15:06:36.223 回答