如何从另一个kext动态转换类?

时间:2014-10-18 14:09:06

标签: c++ xcode iokit kernel-extension

我有两个关键字,kextAkextB。 在kextA中,我正在尝试动态转换(使用OSDynamicCast)指向kextB中的类的指针。

$ sudo kextutil -n -t -d B.kext A.kext
Diagnostics for VD.kext:
...
kxld[com...]: The following symbols are unresolved for this kext:
kxld[com...]:   classInB::metaClass
Link failed (error code 5).
Check library declarations for your kext with kextlibs(8).

有办法做到这一点吗?

classInB中关联A.kext会在加载时出现错误(符号已存在)。

1 个答案:

答案 0 :(得分:0)

您需要将kextB声明为kextA的Info.plist中的依赖项:在OSBundleLibraries字典中,添加kextB的反向DNS包标识符作为键,并将其包版本作为值。您还需要将kextB放在/ SLE或/ LE(10.9+)中,因为这些是搜索依赖项的唯一位置(无论是否已加载kextB)。

这假设您不仅仅是在进行投射,而是实际调用特定于classInB的方法。如果你需要做的就是测试一个特定的类,你也可以不用连接就这样做:

OSMetaClass* classInB_mc = OSMetaClass::getMetaClassWithName("classInB");
OSMetaClassBase* cast_ptr = object_ptr->metaCast(classInB_mc);
if (cast_ptr)
{
  // object_ptr can indeed be cast to classInB
}