So erstellen Sie .ko-Dateien unter Linux


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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.