J'ai déjà soumis cette question sur StackOverflow mais je me suis dit que ce pourrait être un emplacement plus approprié.
Je construis un noyau personnalisé pour Mac OS (Mountain Lion, Darwin 2050.22.13). Je peux très bien construire le noyau et y ajouter des éléments, mais il me manque quelque chose.
Pour faire court, voici un exemple de ce que j'essaie de faire.
Disons que je veux ajouter une fonction [my_func (void *)] à dire, bsd / kern / kern_fork.c Je peux ajouter un fichier include et le coller dans osfmk / bsd et modifier le fichier Makefile afin que le nouveau fichier .h est maintenant copié dans BUILD / obj / RELEASE_X86_64 / EXPORT_HDRS /
J'ai également ajouté le nom de la fonction à config / BSDKernel.exports. Je peux voir la fonction avec son symbole dans / mach_kernel, donc cela semble aller.
Maintenant, voici la partie la plus délicate. Ce n'est pas compliqué en soi mais je n'arrive pas à comprendre. Ce que je veux faire, c'est pouvoir appeler ma fonction à partir d'un kext que j'écris également. Fondamentalement, ce serait une sorte d’API privée pour moi.
Mon kext se compile bien, mais lorsque je lance kextload / kextutil, il se plaint de ne pas trouver le symbole my_func.
(kernel) kxld [com.blah.foo.kext]: les symboles suivants ne sont pas résolus par ce kext (kernel) kxld [com.blah.foo.kext]: _my_func
kextlibs renvoie: Pour toutes les architectures: com.apple.kpi.libkern = 12.3
pour x86_64: symbole introuvable dans aucune bibliothèque kext
La question est donc de savoir comment faire pour que mes fonctions soient visibles par mes kext (s)? Merci!
Mise à jour: Je conviens que ce n'était pas le bon endroit pour poser la question, mais je dois dire que je ne connaissais pas mieux. Quoi qu'il en soit, juste au cas où les gens ici seraient intéressés par ma découverte, voici la réponse à la question (un autre membre de SE m'a aidé):
Il a fallu un effort, mais cela semble être bon maintenant.
OSBundleLibraries ressemble maintenant à ceci:
<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>
La commande GCC ressemble à ceci:
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
Dans config / BSDKernel.exports: _my_func
Dans osfmk / bsd, j'ai bdsfoo.h [qui a un extern int my_func (void)]
Pour construire le noyau:
make ARCH_CONFIGS=X86_64 KERNEL_CONFIGS=RELEASE VERBOSE=YES
Une fois que mach_kernel est copié dans /
cp BUILD/obj/RELEASE_X86_64/BSDKernel.symbolset /System/Library/Extensions/System.kext/PlugIns/BSDKernel.kext/BSDKernel
C'était le chaînon manquant, merci encore à pmjordan
redémarrer. Construire mon kext et kextload, le succès!