Kernel XNU personalizzato

1

Ho già inviato questa domanda su StackOverflow ma ho pensato che potrebbe essere una posizione più appropriata.

Sto costruendo un kernel personalizzato per Mac OS (Mountain Lion, Darwin 2050.22.13). Posso compilare il kernel bene e posso aggiungere cose ma mi manca qualcosa.

Per farla breve, ecco un esempio di ciò che sto cercando di fare.

Diciamo che voglio aggiungere una funzione [my_func (void *)] per dire, bsd / kern / kern_fork.c Posso aggiungere un file include e incollarlo in osfmk / bsd e cambiare il Makefile in modo che il nuovo .h il file è ora copiato in BUILD / obj / RELEASE_X86_64 / EXPORT_HDRS /

Ho anche aggiunto il nome della funzione a config / BSDKernel.exports. Riesco a vedere la funzione con il suo simbolo in / mach_kernel quindi sembrerebbe che andasse bene.

Ora, ecco la parte difficile. Non è difficile di per sé, ma non riesco a capirlo. Quello che voglio fare è essere in grado di effettuare una chiamata alla mia funzione da un kext che sto anche scrivendo. Fondamentalmente sarebbe una sorta di API privata per me.

Il mio kext compila bene ma quando eseguo kextload / kextutil si lamenta che non riesce a trovare il simbolo my_func.

(kernel) kxld [com.blah.foo.kext]: I seguenti simboli non sono risolti da questo kext (kernel) kxld [com.blah.foo.kext]: _my_func

restituisce kextlibs: per tutte le architetture: com.apple.kpi.libkern = 12,3

per x86_64: 1 simbolo non trovato in nessuna libreria kext

Quindi la domanda è: come faccio a rendere le mie funzioni visibili al mio kext (s)? Grazie!

Aggiornamento: Sono d'accordo che questo era il posto sbagliato per pubblicare la domanda, ma devo dire che non lo sapevo meglio. Ad ogni modo, nel caso in cui la gente qui sarebbe interessata alla mia scoperta, ecco la risposta alla domanda (ho ricevuto aiuto da un altro membro di SE):

Ci sono voluti alcuni sforzi ma ora sembra essere buono.

Le OSBundleLibraries ora assomigliano a questo:

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

Il comando GCC ha il seguente aspetto:

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, ho bdsfoo.h [che ha un extern int my_func (void)]

Per compilare il kernel:

make ARCH_CONFIGS=X86_64 KERNEL_CONFIGS=RELEASE VERBOSE=YES

Una volta che mach_kernel è stato copiato in /

cp BUILD/obj/RELEASE_X86_64/BSDKernel.symbolset /System/Library/Extensions/System.kext/PlugIns/BSDKernel.kext/BSDKernel

Questo era il link mancante, grazie ancora a pmjordan

riavvio. Costruisci il mio kext e kextload, successo!

    
posta E.T 18.07.2013 - 06:01
fonte

0 risposte

Leggi altre domande sui tag