2016-05-13 7 views
1

Как использовать политики MAC из TrustedBSD внутри расширения ядра IOKit?Политика IOKit и TrustedBSD

У меня уже есть расширение IOKit, и я хотел бы добавить к нему некоторые политики.

Для тестирования я написал два фиктивных расширения, один из которых использует IOKit и общий.
Общее расширение работает безупречно, в то время как IOKit-один генерирует ошибку связи для символов 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 или любой комбинации тех, без успеха.

Вся информация, которую я мог найти об этом, был 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++, вам нужно сделать это условно на компиляцию C++, используя, как обычно, #ifdef __cplusplus.

+0

Я также нашел это прямо сейчас на этом [комментарий] (http://stackoverflow.com/questions/27702967/mount-approval-callback-on-mac-os-x#comment53763572_27754917) – MathPlayer

1

Вы должны знать, несмотря на то, что эта функциональность была официальная добавленным, основанный на OS X v10.11 API DiffsKernel Changes for Objective-C

enter image description here

К сожалению, началась с High Sierra (10.13) API политики MAC был полностью закрыт для сторонних разработчиков. Apple удалила все ссылки для mac_policy_register, mac_policy_unregister, mac_policy_conf, mac_policy_ops и других основных частей политики MAC из собственных документов.

+0

Где вы можете получить эту информацию из? – MathPlayer

+0

Исходный «включить» больше не начинается с High Sierra (10.13), заголовок «mac_policy.h» был удален из SDK 10.13. Любая информация о политике MAC была удалена в документации Xcode 9 и на портале разработчиков Apple. –