2012-03-30 7 views
5

Wir müssen auf die globalen Kernel-Variablen in net/ipv4/af_inet.c zugreifen, die nicht explizit von einem ladbaren Kernel-Modul exportiert werden. Wir verwenden derzeit 2.6.18 Kernel.Zugriff auf Linux-Kernel-Symbole, die nicht über EXPORT_SYMBOL exportiert werden *

kallsyms_lookup_name scheint nicht vorhanden zu sein mehr (nicht exportiert)

__symbol_get NULL zurück (beim weiteren Lesen, symbol_get/__ symbol_get sieht durch den Kernel und die vorhandenen Module Symboltabellen, die nur Symbol exportiert enthält, und es Gibt es dort, um sicherzustellen, dass das Modul, von dem ein Symbol exportiert wird, tatsächlich geladen wird)

Gibt es trotzdem Zugriff auf Symbole, die nicht von einem Kernelmodul exportiert werden?

Nachdem ich viele Antworten gelesen und gelesen habe, scheint es sehr schwer zu sein, eine Methode über viele Kernel-Versionen hinweg zu finden, da sich die KAPI im Laufe der Zeit erheblich ändert.

+0

Wird 'objdump path/to/modulename.ko' tun, was Sie brauchen? Sie müssten die Ausgabe decodieren, um den entsprechenden Offset im Modul zu bestimmen, und diesen anwenden. Was ist der Zweck, ein Symbol zu erhalten, das nicht exportiert wird? – wallyk

+0

ja, wir können tatsächlich die Adresse über/proc/kallsyms im Userspace bekommen und vielleicht an das Modul weitergegeben werden, aber das scheint ein bisschen hackish zu sein, also habe ich mich gefragt, ob es etwas besseres gibt. Wir versuchen, einen Teil des Netzwerk-Codes herauszuziehen und zu einem Modul zu machen, damit wir Bugfixes durchführen können, ohne den Kernel neu starten zu müssen. –

Antwort

4

Sie können die zuvor erwähnte Methode verwenden, indem Sie sie von/proc/kallsyms abrufen oder einfach die in der System.map angegebene Adresse verwenden (was dasselbe ist), es mag häschenartig erscheinen, aber so habe ich es getan habe es vorher gesehen (musste es nie wirklich selbst machen). Entweder dies oder Sie können Ihren eigenen angepassten Kernel erstellen, in dem Sie EXPORT_SYMBOL für alles ausführen, was exportiert werden soll, aber das ist nicht so portabel.

+0

Jesus, wo hast du die Methode/proc/kallsyms gesehen? Ist das in einer Produktionsumgebung? Sie haben recht, dass wir mit einem Standard-Kernel arbeiten wollen, ohne ihn neu kompilieren zu müssen. –

+0

@softwareengineer Normalerweise testen wir einige Funktionen, die wir dem Kernel hinzufügen wollen, ohne sie neu kompilieren zu müssen, oder einfach nur als entfernbare modulare Funktion. Ich habe es vielleicht ein- oder zweimal gesehen. Davor habe ich die System.map gesehen, wo sie die Adresse einfach in das Modul geschrieben hat. –

+0

danke ich werde ein paar Tage warten und sehen, ob jemand anderes mit etwas kommen kann, aber wenn nicht, würde ich gerne Ihre akzeptieren. –

5

Wenn die Leistung keine große Rolle spielt, können Sie die gesamte Liste der Symbole mit durchqueren (vom Kernel für GPL-Module exportiert) und überprüfen Sie die Namen, um die benötigten zu erhalten. Ich würde es nicht empfehlen, es sei denn, es gibt keine andere Wahl.

Wenn Sie diesen Weg gehen möchten, hier ist an example von einem unserer Projekte. Siehe die Verwendung von sowie den Code symbol_walk_callback(), die anderen Teile sind für diese Frage irrelevant.

+0

danke, Eugene. Diese Funktion scheint jedoch nur in den neueren Kernel verfügbar zu sein. Es war nicht in 2.6.18 oder 2.6.25, aber es ist in 2.6.30. Ich hätte jedoch den Kernel 2.6.18 in meiner ursprünglichen Frage angeben sollen. –