IOPCIDevice не связан при загрузке kext

Я пытаюсь написать драйвер для композитной карты видеозахвата PCI для OSX.

Кекст прекрасно строится, но когда я пытаюсь его загрузить, я получаю следующее:

Diagnostics for /System/Library/Extensions/Conexant878.kext:
Code Signing Failure: code signature is invalid
WARNING - Invalid signature -67030 0xFFFFFFFFFFFEFA2A for kext "/System/Library/Extensions/Conexant878.kext"
(kernel) kxld[com.akasaka.Conexant878]: The following symbols are unresolved for this kext:
(kernel) kxld[com.akasaka.Conexant878]:     __ZN11IOPCIDevice22_RESERVEDIOPCIDevice16Ev
(kernel) kxld[com.akasaka.Conexant878]:     __ZN11IOPCIDevice22_RESERVEDIOPCIDevice17Ev
(kernel) kxld[com.akasaka.Conexant878]:     __ZN11IOPCIDevice22_RESERVEDIOPCIDevice18Ev
(kernel) kxld[com.akasaka.Conexant878]:     __ZN11IOPCIDevice22_RESERVEDIOPCIDevice19Ev
(kernel) kxld[com.akasaka.Conexant878]:     __ZN11IOPCIDevice22_RESERVEDIOPCIDevice20Ev
(kernel) kxld[com.akasaka.Conexant878]:     __ZN11IOPCIDevice22_RESERVEDIOPCIDevice21Ev
(kernel) kxld[com.akasaka.Conexant878]:     __ZN11IOPCIDevice24getDeviceMemoryWithIndexEj
(kernel) Can't load kext com.akasaka.Conexant878 - link failed.
(kernel) Failed to load executable for kext com.akasaka.Conexant878.
(kernel) Kext com.akasaka.Conexant878 failed to load (0xdc008016).
(kernel) Failed to load kext com.akasaka.Conexant878 (error 0xdc008016).
Failed to load /System/Library/Extensions/Conexant878.kext - (libkern/kext) link error.
Check library declarations for your kext with kextlibs(8).

Вывод kextlibs выглядит следующим образом:

For all architectures:
    com.apple.iokit.IOPCIFamily = 2.9
    com.apple.kpi.iokit = 13.4
    com.apple.kpi.libkern = 13.4

For x86_64:
    7 symbols not found in any library kext:
    __ZN11IOPCIDevice24getDeviceMemoryWithIndexEj
    __ZN11IOPCIDevice22_RESERVEDIOPCIDevice16Ev
    __ZN11IOPCIDevice22_RESERVEDIOPCIDevice18Ev
    __ZN11IOPCIDevice22_RESERVEDIOPCIDevice20Ev
    __ZN11IOPCIDevice22_RESERVEDIOPCIDevice17Ev
    __ZN11IOPCIDevice22_RESERVEDIOPCIDevice19Ev
    __ZN11IOPCIDevice22_RESERVEDIOPCIDevice21Ev

Мой Info.plist содержит все библиотеки OSBundleLibraries, которые я мог бы счесть необходимыми в этом контексте, но это все равно не подходит:

...
    <key>IOClass</key>
    <string>ConexantTuner</string>
    <key>OSBundleRequired</key>
    <string>Local-Root</string>
    <key>IOPCIMatch</key>
    <string>0x036e109e</string>
    <key>IOProviderClass</key>
    <string>IOPCIDevice</string>
    <key>IOKitPersonalities</key>
    <dict/>
    <key>OSBundleLibraries</key>
    <dict>
        <key>com.apple.iokit.IOPCIFamily</key>
        <string>1.0.0b1</string>
        <key>com.apple.kpi.mach</key>
        <string>8.0</string>
        <key>com.apple.kpi.unsupported</key>
        <string>8.0</string>
        <key>com.apple.kpi.iokit</key>
        <string>8.0</string>
        <key>com.apple.kpi.libkern</key>
        <string>8.0</string>
        <key>com.apple.kpi.bsd</key>
        <string>8.0</string>
    </dict>
</dict>
</plist>

Что еще я могу попытаться определить, от чего еще мне нужно зависеть, чтобы заставить это работать?

Заранее спасибо.

C++Filt вывод неразрешенных символов:

IOPCIDevice::getDeviceMemoryWithIndex(unsigned int)
IOPCIDevice::_RESERVEDIOPCIDevice16()
IOPCIDevice::_RESERVEDIOPCIDevice18()
IOPCIDevice::_RESERVEDIOPCIDevice20()
IOPCIDevice::_RESERVEDIOPCIDevice17()
IOPCIDevice::_RESERVEDIOPCIDevice19()
IOPCIDevice::_RESERVEDIOPCIDevice21()

person Vladislav Korotnev    schedule 15.03.2016    source источник


Ответы (1)


Похоже на несоответствие между версией SDK, с которой вы строите, и версией OS X, на которую вы пытаетесь загрузить свой kext. В отличие от пользовательского пространства OS X, установки «Цели развертывания» на минимальную версию OS X, поддерживаемую вашим драйвером, недостаточно. Вы также должны использовать версию OS X SDK, соответствующую самой старой поддерживаемой версии OS X именно по этой причине зарезервированных виртуальных функций.

Так, например. возможно, вы используете SDK 10.10 или 10.11, но пытаетесь загрузить kext на 10.9. Это не сработает. Используйте Xcode 6.3.2 (самая новая версия, поставляемая с SDK 10.9), выберите SDK 10.9 и выполните сборку с его помощью.

person pmdj    schedule 16.03.2016
comment
Проблема с GetDeviceMemoryWithIndex ушла, но все остальное осталось :( - person Vladislav Korotnev; 18.03.2016
comment
Очень странно. У вас есть какие-либо настраиваемые пути поиска заголовков или что-то в этом роде? Какие-нибудь специальные флаги компоновщика, такие как скрытие символов? При ближайшем рассмотрении ваш info.plist тоже выглядит не совсем правильно. В частности, ваш словарь IOKitPersonalities пуст, но у вас есть несколько совпадающих ключей IOKit в корне. Они почти наверняка должны быть в личности. Однако они не должны вызывать ошибок ссылок. - person pmdj; 18.03.2016
comment
есть ли индивидуальность для расширений IOKit PCI? - person Vladislav Korotnev; 20.03.2016
comment
Свойства для сопоставления вашего устройства (класс поставщика IOPCIDevice и обычно идентификатор поставщика, идентификатор продукта) и создания экземпляра вашего драйвера должны находиться в индивидуальном словаре iokit. См. developer.apple.com/library/mac /documentation/DeviceDrivers/ - person pmdj; 20.03.2016