У меня есть два кекста, kextA
а также kextB
,
В 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
выдаст ошибку во время загрузки (символ уже существует).
Вы должны объявить kextB как зависимость в Info.plist kextA: в OSBundleLibraries
словарь, добавьте идентификатор обратного DNS-пакета kextB в качестве ключа и его версию пакета в качестве значения. Вам также нужно будет поместить 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
}