So erstellen Sie .ko-Dateien unter Linux

9

Ich habe einen Treiber für ein Gerät unter Linux geschrieben. Wie kann ich gcceine .koDatei erstellen (verwenden ) , um sie in den Kernel einzufügen?

Renjith G.
quelle
Minimales ausführbares Beispiel zum Einfügen auf einem Ubuntu 16.04-Host: github.com/cirosantilli/linux-kernel-module-cheat/tree/…
Ciro Santilli 法轮功 病毒 审查 六四 事件 30

Antworten:

9

Erstellen Sie eine Makefilesolche.

ifneq ($(KERNELRELEASE),)
obj-m   := mymodule.o
else
KDIR    := /lib/modules/$(shell uname -r)/build
PWD     := $(shell pwd)
all:
        $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
install:
        $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules_install
%:
        $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) $@
endif

Angenommen, die Quelle Ihres Moduls befindet sich in mymodule.c, wird durch Ausführen makeerstellt mymodule.ko.

kurzlebig
quelle
Das ist in Ordnung ... Aber ich möchte wissen, welche Option speziell gegeben ist, um es als * .ko wie -c für * .o oder -fpic -shared für * .so für gcc zu erstellen.
Renjith G
Ich glaube nicht, dass gcc eine solche Option hat. Entweder ist .ko nur ein anderer Name für * .a / .so oder (was wahrscheinlicher ist) es wird von einem Skript nachbearbeitet.
Maciej Piechotka
2
@Renjith G: Genau wie ein erstellt .kowird, kann sich von Kernel-Release zu Kernel-Release ändern. Die einzige Möglichkeit, um sicherzustellen, dass Sie mit dem Kernel arbeiten, besteht darin, die Makefiles des Kernels zu verwenden.
Ephemient
Kannst du mir dann die Bedeutung jedes Satzes in der obigen make-Datei erklären?
Renjith G
2

Kurze Antwort: Sie können nicht. Eine .ko-Datei ist mehr als nur eine kompilierte Version Ihrer Treiberquelle. Das Kernel-Build-System enthält beispielsweise einige zusätzliche Informationen (Compiler-Version, Modulabhängigkeiten, ...).

Sie können wahrscheinlich das Kernel-Build-System durchsuchen, um alle erforderlichen Vorgänge zu finden, sollten dies jedoch nicht. Es wird mit ziemlicher Sicherheit mit der nächsten Kernel-Version oder der darauf folgenden brechen. Sie sollten den mitgelieferten Makefile-Ephemient verwenden.

Kristof Provost
quelle