XCode pthread kext编译(链接)问题

XCode pthread kext编译(链接)问题,xcode,multithreading,macos,pthreads,clang,Xcode,Multithreading,Macos,Pthreads,Clang,首先,此处提供了相关代码: 对我的问题的简要描述是,虽然Xcode可以将代码编译成Kext,但生成的Kext缺少pthread和OSSpinLock函数调用 具体来说,当我运行kextlibs-v6 PCIAudioDriver.kext时,我得到了以下结果: GagansMacPro:CMI8788 Gagan$ sudo kextlibs -v 6 PCIAudioDriver.kext/ Kext user-space log filter changed from 0xff2 to 0

首先,此处提供了相关代码:

对我的问题的简要描述是,虽然Xcode可以将代码编译成Kext,但生成的Kext缺少pthread和OSSpinLock函数调用

具体来说,当我运行kextlibs-v6 PCIAudioDriver.kext时,我得到了以下结果:

GagansMacPro:CMI8788 Gagan$ sudo kextlibs -v 6 PCIAudioDriver.kext/
Kext user-space log filter changed from 0xff2 to 0xfff.
Kext kernel-space log filter changed from 0xff2 to 0xfff.
Kext library architecture set to x86_64.
Kext library architecture is x86_64 (unchanged).
For all architectures:
    com.apple.iokit.IOAudioFamily = 203.3
    com.apple.iokit.IOPCIFamily = 2.9
    com.apple.kpi.iokit = 14.5
    com.apple.kpi.libkern = 14.5

For x86_64:
    7 symbols not found in any library kext.
Loading PCIAudioDriver.kext.
(kernel) User-space log flags changed from 0x0 to 0xfff.
(kernel) Received kext load request from user space.
(kernel) Received request from user space to load kext com.CMedia.CMI8788.PCIAudioDriver.
(kernel) Loading kext com.CMedia.CMI8788.PCIAudioDriver.
(kernel) Kext com.apple.kpi.bsd is already loaded.
(kernel) Kext com.apple.kpi.libkern is already loaded.
(kernel) Kext com.apple.kpi.mach is already loaded.
(kernel) Kext com.apple.iokit.IOPCIFamily is already loaded.
(kernel) Kext com.apple.iokit.IOPCIFamily sending 3 personalities to the IOCatalogue and starting matching.
(kernel) Kext com.apple.kpi.iokit is already loaded.
(kernel) Kext com.apple.iokit.IOAudioFamily is already loaded.
(kernel) Kext com.apple.kec.pthread is already loaded.
(kernel) Kext com.apple.kpi.unsupported is already loaded.
(kernel) Allocated link buffer for kext com.CMedia.CMI8788.PCIAudioDriver at 0xffffff7f89b88000 (98304 bytes).
(kernel) kxld[com.CMedia.CMI8788.PCIAudioDriver]: The following symbols are unresolved for this kext:
(kernel) kxld[com.CMedia.CMI8788.PCIAudioDriver]:   _OSSpinLockLock
(kernel) kxld[com.CMedia.CMI8788.PCIAudioDriver]:   _pthread_cond_init
(kernel) kxld[com.CMedia.CMI8788.PCIAudioDriver]:   _pthread_cond_timedwait
(kernel) kxld[com.CMedia.CMI8788.PCIAudioDriver]:   _pthread_mutex_init
(kernel) kxld[com.CMedia.CMI8788.PCIAudioDriver]:   _pthread_mutex_lock
(kernel) kxld[com.CMedia.CMI8788.PCIAudioDriver]:   _pthread_mutex_unlock
(kernel) Can't load kext com.CMedia.CMI8788.PCIAudioDriver - link failed.
(kernel) Failed to load executable for kext com.CMedia.CMI8788.PCIAudioDriver.
(kernel) Kext com.CMedia.CMI8788.PCIAudioDriver failed to load (0xdc008016).
(kernel) Failed to load kext com.CMedia.CMI8788.PCIAudioDriver (error 0xdc008016).
(kernel) Kext com.CMedia.CMI8788.PCIAudioDriver removing all personalities naming it from the IOCatalogue.
Kernel error handling kext request - (libkern/kext) link error.
Failed to load PCIAudioDriver.kext - (libkern/kext) link error.
Failed to load PCIAudioDriver.kext - (libkern/kext) link error.
Check library declarations for your kext with kextlibs(8).
所以我在这个kext上运行了kextutil-v6,得到了这个:

GagansMacPro:CMI8788 Gagan$ sudo kextlibs -v 6 PCIAudioDriver.kext/
Kext user-space log filter changed from 0xff2 to 0xfff.
Kext kernel-space log filter changed from 0xff2 to 0xfff.
Kext library architecture set to x86_64.
Kext library architecture is x86_64 (unchanged).
For all architectures:
    com.apple.iokit.IOAudioFamily = 203.3
    com.apple.iokit.IOPCIFamily = 2.9
    com.apple.kpi.iokit = 14.5
    com.apple.kpi.libkern = 14.5

For x86_64:
    7 symbols not found in any library kext.
Loading PCIAudioDriver.kext.
(kernel) User-space log flags changed from 0x0 to 0xfff.
(kernel) Received kext load request from user space.
(kernel) Received request from user space to load kext com.CMedia.CMI8788.PCIAudioDriver.
(kernel) Loading kext com.CMedia.CMI8788.PCIAudioDriver.
(kernel) Kext com.apple.kpi.bsd is already loaded.
(kernel) Kext com.apple.kpi.libkern is already loaded.
(kernel) Kext com.apple.kpi.mach is already loaded.
(kernel) Kext com.apple.iokit.IOPCIFamily is already loaded.
(kernel) Kext com.apple.iokit.IOPCIFamily sending 3 personalities to the IOCatalogue and starting matching.
(kernel) Kext com.apple.kpi.iokit is already loaded.
(kernel) Kext com.apple.iokit.IOAudioFamily is already loaded.
(kernel) Kext com.apple.kec.pthread is already loaded.
(kernel) Kext com.apple.kpi.unsupported is already loaded.
(kernel) Allocated link buffer for kext com.CMedia.CMI8788.PCIAudioDriver at 0xffffff7f89b88000 (98304 bytes).
(kernel) kxld[com.CMedia.CMI8788.PCIAudioDriver]: The following symbols are unresolved for this kext:
(kernel) kxld[com.CMedia.CMI8788.PCIAudioDriver]:   _OSSpinLockLock
(kernel) kxld[com.CMedia.CMI8788.PCIAudioDriver]:   _pthread_cond_init
(kernel) kxld[com.CMedia.CMI8788.PCIAudioDriver]:   _pthread_cond_timedwait
(kernel) kxld[com.CMedia.CMI8788.PCIAudioDriver]:   _pthread_mutex_init
(kernel) kxld[com.CMedia.CMI8788.PCIAudioDriver]:   _pthread_mutex_lock
(kernel) kxld[com.CMedia.CMI8788.PCIAudioDriver]:   _pthread_mutex_unlock
(kernel) Can't load kext com.CMedia.CMI8788.PCIAudioDriver - link failed.
(kernel) Failed to load executable for kext com.CMedia.CMI8788.PCIAudioDriver.
(kernel) Kext com.CMedia.CMI8788.PCIAudioDriver failed to load (0xdc008016).
(kernel) Failed to load kext com.CMedia.CMI8788.PCIAudioDriver (error 0xdc008016).
(kernel) Kext com.CMedia.CMI8788.PCIAudioDriver removing all personalities naming it from the IOCatalogue.
Kernel error handling kext request - (libkern/kext) link error.
Failed to load PCIAudioDriver.kext - (libkern/kext) link error.
Failed to load PCIAudioDriver.kext - (libkern/kext) link error.
Check library declarations for your kext with kextlibs(8).
我已尽最大努力调整OSBundleLibraries,目前:

    <key>OSBundleLibraries</key>
    <dict>
        <key>com.apple.iokit.IOAudioFamily</key>
        <string>203.3</string>
        <key>com.apple.iokit.IOPCIFamily</key>
        <string>2.9</string>
        <key>com.apple.kec.pthread</key>
        <string>1.0</string>
        <key>com.apple.kpi.bsd</key>
        <string>12.0</string>
        <key>com.apple.kpi.iokit</key>
        <string>14.5</string>
        <key>com.apple.kpi.libkern</key>
        <string>11.2</string>
        <key>com.apple.kpi.mach</key>
        <string>11.2</string>
        <key>com.apple.kpi.unsupported</key>
        <string>11.2</string>
    </dict>
OSBundleLibraries
com.apple.iokit.IOAudioFamily
203.3
com.apple.iokit.IOPCIFamily
2.9
com.apple.kec.pthread
1
com.apple.kpi.bsd
12
com.apple.kpi.iokit
14.5
com.apple.kpi.libkern
11.2
com.apple.kpi.mach
11.2
com.apple.kpi.com不受支持
11.2
但一切都不起作用。我正在10.10.5上运行XCode 7.2.1(带有10.10和10.11 SDK)

pthread和osspinlock函数调用是否隐藏在com.apple.kpi.private或其他文件中?我真的需要这些功能为我的司机,我不能没有他们

我确实记得,当我第一次尝试声明OSSpinLock时,Xcode IDE会说“你是指IOSimpleLOCK吗?”(显然不是),我通过更改OSSpinLock来修复这个问题

#include <libkern/OSAtomic.h>
#包括

#包括
但所有这些都允许XCode“成功”编译代码,如果kextutil/libs报告缺少符号,情况显然不是这样

任何帮助都会很好

谢谢。

感谢来自newosxbook论坛的帮助,我可以解决这个问题

我们交换的成绩单是

,我没有考虑从“内核土地程序”到“内核土地驱动程序”的转换,后者施加了额外的限制,禁止依赖共享库(如pthreads)

因此,我必须将pthread_mutex_lock调用包装到IOLock,并临时使用Siguza的