【问题标题】:IOKit and TrustedBSD policyIOKit 和 TrustedBSD 策略
【发布时间】:2016-05-13 12:28:17
【问题描述】:

如何在 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.plist,以及com.apple.kpi.dsepcom.apple.kpi.unsupportedcom.apple.kpi.mach 或这些的任意组合,但没有成功。

我能找到的所有信息都是这个thread on the darwin-kernel讨论列表。

我现在的目标是 OS X 10.11。

【问题讨论】:

    标签: macos linker kernel iokit kernel-extension


    【解决方案1】:

    您应该知道,尽管事实上这个功能是官方添加的,基于 OS X v10.11 API Diffs Kernel Changes for Objective-C

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

    【讨论】:

    • 你从哪里得到这些信息?
    • 原生“include”不再适用于从 High Sierra (10.13) 开始,“mac_policy.h”标头已从 SDK 10.13 中删除。 Xcode 9 文档和 Apple 开发者门户中删除了有关 MAC 策略的任何信息。
    【解决方案2】:

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

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

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

    【讨论】:

    • 我现在也在这个comment上找到了这个
    猜你喜欢
    • 2019-07-27
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多