看起来 Linux 方面已经在评论中得到了回答。
对于 macOS kexts,使用的机制是OSBundleLibraries
和OSBundleCompatibleVersion
Info.plist 属性。kext导出符号必须具有OSBundleCompatibleVersion
属性集。这必须小于或等于它CFBundleVersion
,并允许您对 API 进行版本控制。
希望导入其他 kext 符号的 kext 必须在字典中列出导出kext 的包标识符,并带有适当的版本号。OSBundleLibraries
请注意,链接到另一个 kext 将导入其所有公共符号,因此我强烈建议将所有符号默认隐藏并提供显式导出文件。为此,请在 Xcode 目标设置中启用“Symbols hidden by default”,创建一个新的 .exp(或 .exports)文件,并在“Exported Symbols File”设置中声明它。至少,您需要添加_kmod_info
到此文件中。然后添加您要导出的所有符号,每行一个。
C 函数和全局变量需要以下划线作为前缀,C++ 函数和静态类成员变量需要以通常的方式进行修改。您可以将*
其用作(部分)通配符,例如,这对于具有大量成员函数的 C++ 类有时很方便。如果您需要参考,xnu 源代码分发包含大量导出文件示例。您可以使用该nm
工具生成 kext 中所有符号的列表,然后您可以从中挑选;这使您免于手动修改名称。
Kexts 不能循环地相互依赖。一个需要成为“库”,另一个是该库的“用户”。如果它们需要交互,则需要使用回调、虚函数等。
“库”kext必须安装在 /Library/Extensions(OS X 10.8 或更早版本上的 /System/Library/Extensions)中,否则即使库 kext 已经加载,库的用户也可能找不到它。如果您的“用户”kext 在其OSBundleRequired
属性中指定本地或网络引导可能需要它,则它所依赖的库应声明相同或这些条件的超集,否则它们可能未适当地预链接/kextcached。
Apple 也有少量关于设计 kext 库的文档。