GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Widerspricht der Version des Symbols symbol_name nach insmod

Sie müssen Ihr Kernel-Modul für dieselbe Kernel-Version erstellen, die Sie ausführen werden. Wenn Sie also Kernel 4.3-Quellen heruntergeladen haben, müssen Sie das kompilieren Version des Kernels und booten Sie damit, bevor Sie versuchen, Ihren Kernel zu laden.

Sie haben dann zwei Lösungen:

  1. Laden Sie die Kernel-Quellen für den Kernel herunter, den Sie gerade ausführen (Sie können diese mit zypper install kernel-source installieren auf SLES oder einem entsprechenden Befehl auf anderen Distributionen.)
  2. Kompilieren und installieren Sie den 4.3-Kernel in Ihrem Betriebssystem. Wenn Sie dabei Hilfe benötigen, stellen Sie eine separate Frage (und sie gehört wahrscheinlich zum Superuser, nicht hierher). Beachten Sie, dass, wenn Kernel und Glibc eng gekoppelt sind, es möglich ist, dass Sie keinen neuen Kernel ausführen können, wenn Sie eine sehr alte C-Bibliothek haben.

make -C /lib/modules/$(uname -r)/build M=$PWD modules, "$(uname -r)" zeigt, dass Sie gegen die Kernel-Version kompilieren, die Sie jetzt ausführen, also sollten Sie in der Lage sein, insmod das Modul im aktuellen Kernel, wenn Sie die Header nicht geändert haben.

Aus Ihrem Text:"Nur zur Überprüfung habe ich ein paar Dateien aus den Kernel-Verzeichnissen in mein Projektverzeichnis kopiert. Änderungen daran vorgenommen und etwas mehr Code eingefügt."

Wenn Sie Änderungen an der Kernelquelle vorgenommen haben, müssen Sie möglicherweise den neuen Kernel neu kompilieren und mit dem neuen aktualisierten Kernel booten. Dann sollten Sie in der Lage sein, Ihr Kernelmodul mit den geänderten Headern zu kompilieren.


Das Problem dabei ist, dass Ihr Kernel-Modul die exportierten Symbole anderer Kernel-Module verwendet, die in diesem Fall die exportierten Methoden oder Symbole des Linux InfiniBand RDMA-Stacks zu sein scheinen.

Um die Probleme mit der Symbolversion zu lösen, kopieren Sie die Datei Module.symvers Datei aus dem

/usr/src/ofa-kernel

Verzeichnis und fügen Sie es in Ihr aktuelles Arbeitsverzeichnis ein. Dann machst du deine Module neu. Jetzt die insmod sollte einwandfrei funktionieren.

HINWEIS:Die Datei Module.symvers enthält Informationen über alle exportierten Kernelmodule-Symbole. Indem Sie es also in Ihr Arbeitsverzeichnis kopieren, helfen Sie kbuild, mehr über die verwendeten exportierten Symbole zu erfahren.

Und wenn Sie Module.symvers nicht finden oder es leer ist, erstellen Sie eines mit create_Module.symvers.sh


Linux
  1. So überprüfen Sie die Kernel-Version unter Linux

  2. Linux – Ein verdorbener Kernel in Linux?

  3. Linux – Wie lädt man ein Kernel-Modul richtig neu?

  4. insmod:Befehl nicht gefunden

  5. Wie verwende ich ioctl(), um mein Kernel-Modul zu manipulieren?

So laden oder entladen Sie ein Linux-Kernel-Modul

Ubuntu 22.04 Kernelversion

So überprüfen Sie die Kernel-Version in Linux

Modprobe-Befehl unter Linux

Verständnis der effektiven Kernel-Version von Ksplice

Änderungen der Parameter des Kernelmoduls (unter Verwendung von /sys/module)