Ya he enviado esta pregunta en StackOverflow pero pensé que esta podría ser una ubicación más apropiada.
Estoy creando un núcleo personalizado para Mac OS (Mountain Lion, Darwin 2050.22.13). Puedo construir el kernel muy bien y puedo agregarle cosas pero me falta algo.
Para abreviar, aquí hay una muestra de lo que estoy tratando de hacer.
Digamos que quiero agregar una función [my_func (void *)] para decir, bsd / kern / kern_fork.c Puedo agregar un archivo de inclusión y pegarlo en osfmk / bsd y cambiar el Makefile para que el nuevo El archivo .h ahora se copia en BUILD / obj / RELEASE_X86_64 / EXPORT_HDRS /
También agregué el nombre de la función a config / BSDKernel.exports. Puedo ver la función con su símbolo en / mach_kernel por lo que parece estar bien.
Ahora, aquí está la parte difícil. No es complicado por sí mismo, pero no puedo entenderlo. Lo que quiero hacer es poder hacer una llamada a mi función desde un kext que también estoy escribiendo. Básicamente, sería una especie de API privada para mí.
Mi kext se compila bien, pero cuando ejecuto kextload / kextutil se queja de que no puede encontrar el símbolo my_func.
(kernel) kxld [com.blah.foo.kext]: Los siguientes símbolos no están resueltos por este kext (kernel) kxld [com.blah.foo.kext]: _my_func
kextlibs devuelve: Para todas las arquitecturas: com.apple.kpi.libkern = 12.3
para x86_64: 1 símbolo no encontrado en cualquier biblioteca kext
Entonces, la pregunta es ¿cómo hago para que mis funciones sean visibles para mis kext (s)? Gracias!
Actualización: Estoy de acuerdo en que este era el lugar equivocado para publicar la pregunta, pero debo decir que no sabía nada mejor. De todos modos, en caso de que la gente aquí esté interesada en mi descubrimiento, aquí está la respuesta a la pregunta (recibí ayuda de otro miembro de SE):
Tomó un poco de esfuerzo pero parece ser bueno ahora.
Las OSBundleLibraries ahora tienen este aspecto:
<key>OSBundleLibraries</key>
<dict>
<key>com.apple.kpi.libkern</key>
<string>12.3</string>
<key>com.apple.kpi.bsd</key>
<string>12.3</string>
</dict>
El comando GCC tiene este aspecto:
cc -m64 -Xlinker -kext -static -c foo.c -o Contents/MacOS/foo -fno-builtin -nostdlib -lkmod -r -mlong-branch -I/System/Library/Frameworks/Kernel.Framework/Headers -Wall
En config / BSDKernel.exports: _my_func
En osfmk / bsd, tengo bdsfoo.h [que tiene un extern int my_func (void)]
Para construir el kernel:
make ARCH_CONFIGS=X86_64 KERNEL_CONFIGS=RELEASE VERBOSE=YES
Una vez que se haya copiado mach_kernel a /
cp BUILD/obj/RELEASE_X86_64/BSDKernel.symbolset /System/Library/Extensions/System.kext/PlugIns/BSDKernel.kext/BSDKernel
Este fue el enlace que falta, gracias de nuevo a pmjordan
reiniciar. ¡Construye mi kext y kextload, éxito!