Ich habe diese Frage bereits bei StackOverflow eingereicht, aber ich bin der Meinung, dass dies ein geeigneterer Ort sein könnte.
Ich erstelle einen benutzerdefinierten Kernel für Mac OS (Mountain Lion, Darwin 2050.22.13). Ich kann den Kernel ganz gut bauen und ich kann Sachen hinzufügen, aber mir fehlt etwas.
Um die Dinge kurz zu halten, hier ein Beispiel dessen, was ich versuche zu tun.
Angenommen, ich möchte eine Funktion [my_func (void *)] hinzufügen, um zu sagen, bsd / kern / kern_fork.c. Ich kann eine Include-Datei hinzufügen und in osfmk / bsd einfügen und das Makefile so ändern, dass die neue .h-Datei entsteht wird nun nach BUILD / obj / RELEASE_X86_64 / EXPORT_HDRS / kopiert
Ich habe auch den Funktionsnamen zu config / BSDKernel.exports hinzugefügt. Ich kann die Funktion mit ihrem Symbol in / mach_kernel sehen, sodass sie in Ordnung zu sein scheint.
Nun, hier ist der schwierige Teil. Es ist per se nicht schwierig, aber ich kann es nicht herausfinden. Ich möchte in der Lage sein, meine Funktion aus einem Text heraus aufzurufen, den ich gerade schreibe. Im Grunde wäre es eine Art private API für mich.
Mein kext kompiliert gut, aber wenn ich kextload / kextutil starte, beschwert es sich, dass es das my_func-Symbol nicht finden kann.
(kernel) kxld [com.blah.foo.kext]: Die folgenden Symbole werden von diesem kext (kernel) kxld [com.blah.foo.kext] nicht aufgelöst: _my_func
kextlibs gibt Folgendes zurück: Für alle Architekturen: com.apple.kpi.libkern = 12.3
für x86_64: 1 Symbol in keinem Bibliothekstext gefunden
Die Frage ist also, wie ich meine Funktion (en) für meine Texte sichtbar machen kann (n). Vielen Dank!
Update: Ich stimme zu, dass dies der falsche Ort war, um die Frage zu posten, aber ich muss sagen, dass ich es nicht besser wusste. Sowieso, nur für den Fall, dass die Leute hier an meiner Entdeckung interessiert wären, hier ist die Antwort auf die Frage (ich habe Hilfe von einem anderen SE-Mitglied erhalten):
Hat etwas Mühe gekostet, aber es scheint jetzt gut zu sein.
Die OSBundleLibraries sehen jetzt so aus:
<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>
Der GCC-Befehl sieht folgendermaßen aus:
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
In config / BSDKernel.exports: _my_func
In osfmk / bsd habe ich bdsfoo.h [mit einem externen int my_func (void)]
So erstellen Sie den Kernel:
make ARCH_CONFIGS=X86_64 KERNEL_CONFIGS=RELEASE VERBOSE=YES
Sobald mach_kernel nach / kopiert wurde
cp BUILD/obj/RELEASE_X86_64/BSDKernel.symbolset /System/Library/Extensions/System.kext/PlugIns/BSDKernel.kext/BSDKernel
Dies war das fehlende Glied, noch einmal dank pmjordan
neustarten. Bauen Sie mein Kext und Kextload, Erfolg!