我正在为Mac构建一个定制内核(Mountain Lion,Darwin 2050.22.13)。我可以很好地构建内核,也可以向其中添加一些东西,但我缺少一些东西。
简而言之,这里是我正在尝试做的一个示例。
假设我想添加一个函数my_func(my_func*),也就是说,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符号。
(内核) kxldcom.blah.foo.kext:此kext (内核)kxldcom.blah.foo.kext无法解析以下符号:_my_func
kextlibs返回:对于所有架构: com.apple.kpi.libkern = 12.3
对于x86_64:在任何库中都找不到1个符号kext
所以问题是我怎么做才能让我的函数对kext可见?谢谢!
发布于 2013-07-17 23:06:36
我认为BSDKernel.exports中的符号最终会出现在kext中,因此您需要将其添加到com.apple.kpi.bsd的info.plist中的OSBundleLibraries字典中。我不能百分之百确定这就是你需要做的全部事情,所以如果不起作用,请告诉我们。
更新:
内置的KPI实际上是由System.kext的“插件”目录中的伪kext表示的。那么对于BSDKernel的KPI来说,这可能就是需要进行实物更新的/System/Library/Extensions/System.kext/PlugIns/BSDKernel.kext/了?
make all似乎不会自动构建一个新的System.kext。然而,在config/Makefile中有很大一部分专门介绍System.kext,而且它似乎是安装目标的一部分。make install或许能做到这一点。或者,如果你对此保持警惕(就像我一样),这似乎是关键的一句话:
install $(INSTALL_FLAGS) $(OBJROOT)/BSDKernel.symbolset $(DSTROOT)/$(INSTALL_KEXT_DIR)/System.kext/PlugIns/BSDKernel.kext/BSDKernel; \换句话说,备份您的System.kext,然后在/System/Library/Extensions/System.kext/PlugIns/BSDKernel.kext/BSDKernel上复制BUILD/obj/RELEASE_X86_64/BSDKernel.symbolset并尝试引导。
祝你好运!
https://stackoverflow.com/questions/17687778
复制相似问题