Как динамически привести класс из другого кекста?

У меня есть два кекста, 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 выдаст ошибку во время загрузки (символ уже существует).

1

Решение

Вы должны объявить 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
}
0

Другие решения


По вопросам рекламы [email protected]