1

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 から見えるようにするにはどうすればよいかということです。ありがとう!

4

2 に答える 2

1

pmjordan のおかげで、これを機能させることができました。少し苦労しましたが、今はいい感じです。

OSBundleLibraries は次のようになります。

<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>

GCC コマンドは次のようになります。

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

config/BSDKernel.exports 内: _my_func

osfmk/bsd には、bdsfoo.h があります [これには extern int my_func(void) があります]

カーネルをビルドするには:

make ARCH_CONFIGS=X86_64 KERNEL_CONFIGS=RELEASE VERBOSE=YES

mach_kernel が / にコピーされると、

cp BUILD/obj/RELEASE_X86_64/BSDKernel.symbolset /システム/ライブラリ/拡張機能/System.kext/PlugIns/BSDKernel.kext/BSDKernel

これはミッシング リンクでした。pmjordan に感謝します。

リブート。私の kext と kextload をビルドしてください。成功です!

于 2013-07-19T01:32:59.997 に答える