如何在TrustedBSD内核扩展中使用来自IOKit的MAC策略?
我已经有了一个可以工作的IOKit扩展,我想在其中添加一些策略。
为了进行测试,我编写了两个虚拟扩展,一个使用IOKit,另一个使用通用扩展。
泛型扩展工作得完美无缺,而IOKit one正在为符号mac_policy_register和mac_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.dsep、com.apple.kpi.unsupported、com.apple.kpi.mach或这些库的任何组合中,但都没有成功。
我能找到的所有有关这方面的信息都是这个达尔文内核上的线程讨论列表。
我现在的目标是OSX10.11。
发布于 2016-05-16 10:03:20
注意缺失的符号是如何被破坏的,就好像它们是C++函数一样,但是问题中的函数实际上是普通的C函数。这意味着当您从C++调用它们时,它们使用的是缺少extern "C"链接说明符的声明。MAC头没有考虑到C++,所以当从.cpp文件中包含它们时,需要显式地将它们封装在extern "C"块中,如下所示:
extern "C" {
#include <security/mac_policy.h>
}如果您的#include位于混合的C/C++头文件中,那么您需要像往常一样使用#ifdef __cplusplus将其作为C++编译的条件。
发布于 2017-06-13 11:49:57
您应该知道,尽管这个功能是官方添加的,基于OSXv10.11api的差异目标C的内核更改

Unfortunately,从高塞拉利昂(10.13) MAC策略API开始,对第三方开发人员完全关闭。苹果从自己的文档中删除了对mac_policy_register、mac_policy_unregister、mac_policy_conf、mac_policy_ops和其他主要MAC策略部分的所有引用。
https://stackoverflow.com/questions/37210080
复制相似问题