Ich habe zwei Kernel-Module (sagen wir modA und modB). modA exportiert ein Symbol mit EXPORT_SYMBOL(symA)
und modB verwendet es. Ich habe den Header modA.h
für modA:
und in modB.c
:
Wenn ich insmod
modB alles gut funktioniert, ist mein modB korrekt im Kernel verbunden und die Funktion symA
wird korrekt aufgerufen. Wenn ich jedoch modB erstelle, löst der Compiler eine Warnung aus: symA is undefined
. Ein LKM ist ein ELF, der verschoben werden kann, warum also der Compiler diese Warnung auslöst? Wie kann das entfernt werden?
Dieses Problem (und wie man in diesem Fall richtig kompiliert) wird in Ссылка Manchmal verwendet ein externes Modul exportierte Symbole von einem anderen
externes Modul. kbuild benötigt volle Kenntnis aller Symbole
um zu vermeiden, Warnungen über undefinierte Symbole auszuspucken. Drei
Lösungen existieren für diese Situation. HINWEIS: Die Methode mit einer kbuild-Datei auf oberster Ebene wird empfohlen, kann aber
in bestimmten Situationen unpraktisch sein. Verwenden Sie eine kbuild-Datei auf oberster Ebene. Wenn Sie zwei Module haben, foo.ko und
bar.ko, wo foo.ko Symbole von bar.ko benötigt, kannst du a verwenden
allgemeine kbuild-Datei auf oberster Ebene, so dass beide Module in der
gleicher Aufbau Berücksichtigen Sie das folgende Verzeichnislayout: Kenntnis der Symbole von jedem Modul. Verwenden Sie eine zusätzliche Modul.symvers-Datei Wenn ein externes Modul erstellt wird,
Eine Module.symvers-Datei wird generiert, die alle exportierten Symbole enthält
welche nicht im Kernel definiert sind. Um Zugriff auf Symbole zu erhalten
bar.ko, kopieren Sie die Datei Module.symvers aus der Zusammenstellung von bar.ko
in das Verzeichnis, in dem foo.ko erstellt wird. Während des Modulbaus
kbuild liest die Datei Module.symvers im Verzeichnis des
externes Modul, und wenn der Build abgeschlossen ist, ein neues
Die Datei Module.symvers wird erstellt und enthält die Summe aller Symbole
definiert und nicht Teil des Kernels. Verwenden Sie "make" Variable KBUILD_EXTRA_SYMBOLS Wenn es unpraktisch ist
Kopieren Sie Module.Symvers von einem anderen Modul, Sie können ein Leerzeichen zuweisen
getrennte Liste von Dateien in KBUILD_EXTRA_SYMBOLS in Ihrer Build-Datei.
Diese Dateien werden von modpost während der Initialisierung von geladen
seine Symboltabellen.
Tags und Links gcc linux kernel-module