2012-03-30 14 views
5

È necessario accedere ai vars globali del kernel in net/ipv4/af_inet.c che non vengono esportati esplicitamente da un modulo del kernel caricabile. Al momento stiamo usando il kernel 2.6.18.Accedere ai simboli del kernel Linux che non vengono esportati tramite EXPORT_SYMBOL *

kallsyms_lookup_name non sembra essere più disponibile (non esportata)

__symbol_get restituisce NULL (su ulteriori letture, symbol_get/__ symbol_get guarda attraverso tabelle dei simboli del kernel ed esistenti moduli che contiene esportate unico simbolo, ed è è lì per assicurarsi che il modulo da cui viene esportato un simbolo sia effettivamente caricato)

C'è comunque accesso ai simboli che non vengono esportati da un modulo del kernel?

Dopo aver letto e visto le risposte fornite alle persone fornite, sembra molto difficile trovare un metodo su molte versioni del kernel poiché il kAPI cambia significativamente nel tempo.

+0

Will 'objdump path/to/modulename.ko' fa ciò che ti serve? Dovresti decodificare l'output per determinare l'offset corrispondente nel modulo e applicarlo. Qual è lo scopo di ottenere un simbolo che non viene esportato? – wallyk

+0

sì, siamo in grado di ottenere l'indirizzo tramite/proc/kallsyms nello spazio utente e magari passato al modulo, ma sembra un po 'hacker quindi mi chiedevo se c'è qualcosa di meglio. Stiamo cercando di estrarre parte del codice di rete e renderlo un modulo in modo da poter eseguire correzioni di errori senza dover riavviare il kernel. –

risposta

4

È possibile utilizzare il metodo menzionato in precedenza scaricandolo da/proc/kallsyms o semplicemente utilizzare l'indirizzo fornito in System.map (che è la stessa cosa), potrebbe sembrare un hacker ma è così che ho visto lo ha fatto prima (non ho mai dovuto farlo da solo). O questo o puoi creare il tuo kernel personalizzato dove effettivamente fai EXPORT_SYMBOL su qualunque cosa tu voglia esportare, ma questo non è così portabile.

+0

Gesù, dove hai visto il metodo/proc/kallsyms? È in un ambiente di produzione? Hai ragione che vogliamo lavorare con un kernel standard senza doverlo ricompilare. –

+0

@softwareengineer Solitamente nel testare alcune funzionalità che vogliamo aggiungere al kernel senza doverle ricompilare o semplicemente averlo come funzionalità modulare rimovibile. L'ho visto forse una o due volte. Prima di ciò ho visto il file System.map in cui hanno semplicemente codificato l'indirizzo nel modulo. –

+0

grazie aspetterò qualche giorno e vedrò se qualcun altro può inventare qualcosa, ma in caso contrario sarei felice di accettare il tuo. –

5

Se le prestazioni non sono un problema, è possibile attraversare l'intero elenco di simboli con kallsyms_on_each_symbol() (esportato dal kernel per i moduli GPL) e controllare i nomi per ottenere quelli necessari. Non raccomanderei di farlo, a meno che non ci sia altra scelta.

Se vuoi andare in questo modo, ecco an example da uno dei nostri progetti. Vedi l'uso di kallsyms_on_each_symbol() e il codice di symbol_walk_callback(), le altre parti sono irrilevanti a questa domanda.

+0

grazie, Eugene. tuttavia, questa funzione sembra essere disponibile solo nei kernel più recenti. Non era in 2.6.18 o 2.6.25, ma è in 2.6.30. Avrei dovuto specificare il kernel 2.6.18 nella mia domanda originale. –

Problemi correlati