IOKit和TrustedBSD策略

时间:2016-05-13 12:28:17

标签: macos linker kernel iokit kernel-extension

如何在IOKit内核扩展中使用TrustedBSD的MAC策略?

我已经有一个有效的IOKit扩展,我想为它添加一些策略。

为了进行测试,我编写了两个虚拟扩展,一个使用IOKit,另一个使用通用扩展 通用扩展正在完美运行,而IOKit正在为符号mac_policy_registermac_policy_unregister生成链接错误。

$ sudo kextutil -tn /tmp/MACPolicy.kext
kxld[com.Test.MACPolicy]: The following symbols are unresolved for this kext:
kxld[com.Test.MACPolicy]:   mac_policy_register(mac_policy_conf*, unsigned int*, void*)
kxld[com.Test.MACPolicy]:   mac_policy_unregister(unsigned int)
Link failed (error code 5).
Check library declarations for your kext with kextlibs(8).

$ sudo kextlibs -v 6 -undef-symbols /tmp/MACPolicy.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.kpi.iokit = 15.4
    com.apple.kpi.libkern = 15.4

For x86_64:
    2 symbols not found in any library kext:
    __Z21mac_policy_unregisterj
    __Z19mac_policy_registerP15mac_policy_confPjPv

我已将指定的库添加到Info.plistcom.apple.kpi.dsepcom.apple.kpi.unsupportedcom.apple.kpi.mach或其中的任意组合,但未成功。

我能找到的有关此问题的所有信息都是thread on the darwin-kernel讨论列表。

我目前正在以OS X 10.11为目标。

2 个答案:

答案 0 :(得分:2)

你应该知道,尽管基于 OS X v10.11 API Diffs Kernel Changes for Objective-C

,此功能已正式添加

enter image description here

不幸,从 High Sierra(10.13)开始 MAC政策API对第三方开发者完全关闭。 Apple从自己的文档中删除了mac_policy_registermac_policy_unregistermac_policy_confmac_policy_ops以及其他主要MAC政策部分的所有引用。

答案 1 :(得分:1)

注意丢失的符号是如何被破坏的,就好像它们是C ++函数一样,但问题中的函数实际上是普通的C函数。这意味着当您从C ++调用它们时,它们会使用缺少extern "C"链接说明符的声明。 MAC标头不考虑C ++,因此当从.cpp文件中包含它们时,您需要明确地将它们包装在extern "C"块中,如下所示:

extern "C" {
#include <security/mac_policy.h>
}

如果您的#include位于混合的C / C ++头文件中,您需要像往常一样使用#ifdef __cplusplus以C ++编译为条件。