Mac OS (Mountain Lion、Darwin 2050.22.13) 用のカスタム カーネルを構築しています。カーネルを問題なくビルドでき、それに何かを追加できますが、何かが欠けています。
簡潔にするために、ここに私がやろうとしていることのサンプルがあります。
関数 [my_func(void*)] を追加して、bsd/kern/kern_fork.c を追加したいとします。インクルード ファイルを追加して osfmk/bsd に貼り付け、Makefile を変更して、新しい .h ファイルがBUILD/obj/RELEASE_X86_64/EXPORT_HDRS/ にコピーされるようになりました
関数名も config/BSDKernel.exports に追加しました。/mach_kernel に関数のシンボルが表示されているので、問題ないように見えます。
さて、ここがトリッキーな部分です。それ自体はトリッキーではありませんが、理解できません。私がやりたいことは、私が書いている kext から関数を呼び出せるようにすることです。基本的には、私にとってはある種のプライベート API になります。
kext は正常にコンパイルされますが、kextload/kextutil を実行すると、my_func シンボルが見つからないというエラーが表示されます。
(カーネル) kxld[com.blah.foo.kext]: 次のシンボルは、この kext によって解決されません (カーネル) kxld[com.blah.foo.kext]: _my_func
kextlibs の戻り値: すべてのアーキテクチャの場合: com.apple.kpi.libkern = 12.3
x86_64 の場合: ライブラリ kext に 1 つのシンボルが見つかりません
問題は、関数を kext から見えるようにするにはどうすればよいかということです。ありがとう!