2016-05-13 45 views
1

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

我已经有一个工作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现在。

回答

1

通知书丢失的符号是如何错位,好像他们是C++的功能,但在问题的函数实际上是简单的C函数。这意味着当你从C++调用它们时,它们使用的是缺少extern "C"链接说明符的声明。该MAC头不考虑C++,所以从.cpp文件,包括他们的时候,你需要用他们在extern "C"块明确的,就像这样:

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

如果您#include是一个混合的C/C++头文件,你需要像往常一样使用#ifdef __cplusplus来使它成为C++编译的条件。

+0

我现在还在这个[注释]上发现了这个问题(http://stackoverflow.com/questions/27702967/mount-approval-callback-on-mac-os-x#comment53763572_27754917) – MathPlayer

1

你应该知道,尽管事实上,这个功能被正式加入,基于OS X v10.11 API的diffKernel Changes for Objective-C

enter image description here

不幸的是,从开始高Sierra(10.13) MAC策略API对于第三方开发人员完全关闭。苹果删除了所有引用的mac_policy_registermac_policy_unregistermac_policy_confmac_policy_ops,并从自己的单证等主要MAC政策部分。

+0

你从哪里得到这个信息从? – MathPlayer

+0

本机“包含”不再从High Sierra(10.13)开始工作,从SDK 10.13中删除了“mac_policy.h”头。有关MAC策略的任何信息已在Xcode 9文档和Apple开发人员门户中删除。 –