2011-01-17 9 views
3

Ich habe Probleme, irgendwelche Kernel-Module auf meinem Rechner zu bauen. Jedes Mal, wenn ich ein Modul zu bauen, modpost immer sagt, es gibt null Module:Linux: Modpost baut nichts

MODPOST 0 modules 

Um das Problem zu beheben, habe ich ein Testmodul (hello.c):

#include <linux/module.h>  /* Needed by all modules */ 
#include <linux/kernel.h>  /* Needed for KERN_INFO */ 
#include <linux/init.h>   /* Needed for the macros */ 

static int __init hello_start(void) 
{ 
printk(KERN_INFO "Loading hello module...\n"); 
printk(KERN_INFO "Hello world\n"); 
return 0; 
} 

static void __exit hello_end(void) 
{ 
printk(KERN_INFO "Goodbye Mr.\n"); 
} 

module_init(hello_start); 
module_exit(hello_end); 

Hier ist das Makefile für die Modul:

obj-m = hello.o 
KVERSION = $(shell uname -r) 
all: 
     make -C /lib/modules/$(KVERSION)/build M=$(shell pwd) modules 
clean: 
     make -C /lib/modules/$(KVERSION)/build M=$(shell pwd) clean 

Wenn ich es auf meiner Maschine bauen, bekomme ich die folgende Ausgabe:

make -C /lib/modules/2.6.32-27-generic/build M=/home/waffleman/tmp/mod-test modules 
make[1]: Entering directory `/usr/src/linux-headers-2.6.32-27-generic' 
    CC [M] /home/waffleman/tmp/mod-test/hello.o 
    Building modules, stage 2. 
    MODPOST 0 modules 
make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-27-generic' 

Wenn ich das Modul auf einer anderen Maschine zu machen, es ist erfolgreich:

make -C /lib/modules/2.6.24-27-generic/build M=/home/somedude/tmp/mod-test modules 
make[1]: Entering directory `/usr/src/linux-headers-2.6.24-27-generic' 
    CC [M] /home/somedude/tmp/mod-test/hello.o 
    Building modules, stage 2. 
    MODPOST 1 modules 
    CC  /home/somedude/tmp/mod-test/hello.mod.o 
    LD [M] /home/somedude/tmp/mod-test/hello.ko 
make[1]: Leaving directory `/usr/src/linux-headers-2.6.24-27-generic' 

ich für jede relevante Dokumentation über modpost sah, fand aber wenig. Wer weiß, wie Modpost entscheidet, was er bauen soll? Gibt es eine Umgebung, die ich möglicherweise vermisse?

BTW hier ist, was ich bin mit:

uname -a 
Linux waffleman-desktop 2.6.32-27-generiC#49-Ubuntu SMP Wed Dec 1 23:52:12 UTC 2010 i686 GNU/Linux 

bearbeiten

ist hier RAN mit V = 1 machen:

make -C /lib/modules/2.6.32-27-generic/build M=/home/waffleman/tmp/mod-test modules 
make[1]: Entering directory `/usr/src/linux-headers-2.6.32-27-generic' 
test -e include/linux/autoconf.h -a -e include/config/auto.conf || (  \ 
    echo;        \ 
    echo " ERROR: Kernel configuration is invalid.";  \ 
    echo "   include/linux/autoconf.h or include/config/auto.conf are missing."; \ 
    echo "   Run 'make oldconfig && make prepare' on kernel src to fix it."; \ 
    echo;        \ 
    /bin/false) 
mkdir -p /home/waffleman/tmp/mod-test/.tmp_versions ; rm -f /home/waffleman/tmp/mod-test/.tmp_versions/* 
make -f scripts/Makefile.build obj=/home/waffleman/tmp/mod-test 
    gcc -Wp,-MD,/home/waffleman/tmp/mod-test/.hello.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-27-generic/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DMODULE -D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(hello)" -D"KBUILD_MODNAME=KBUILD_STR(hello)" -c -o /home/waffleman/tmp/mod-test/.tmp_hello.o /home/waffleman/tmp/mod-test/hello.c 
    set -e ; perl /usr/src/linux-headers-2.6.32-27-generic/scripts/recordmcount.pl "i386" "32" "objdump" "objcopy" "gcc" "ld" "nm" "" "" "1" "/home/waffleman/tmp/mod-test/hello.o"; 
(cat /dev/null; echo kernel//home/waffleman/tmp/mod-test/hello.ko;) > /home/waffleman/tmp/mod-test/modules.order 
make -f /usr/src/linux-headers-2.6.32-27-generic/scripts/Makefile.modpost 
    scripts/mod/modpost -m -a -i /usr/src/linux-headers-2.6.32-27-generic/Module.symvers -I /home/waffleman/tmp/mod-test/Module.symvers -o /home/waffleman/tmp/mod-test/Module.symvers -S -w -s 
make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-27-generic' 
[email protected]:~/tmp/mod-test$ cat /home/waffleman/tmp/mod-test/modules.order 
kernel//home/waffleman/tmp/mod-test/hello.ko 
+2

mit dem Kompilieren Versuchen 'V = machen 1' könnte es eine Kompilierung sein Error. – ismail

+0

Dies gab ein wenig mehr Leistung. Beide enthalten/linux/autoconf.h und include/config/auto.conf. – waffleman

Antwort

0

Der Fehler auf mysteriöse Weise weg ging. Wenn jemand eine Idee hat, was das verursachen könnte. Ich würde gerne wissen, falls es ein nächstes Mal gibt.

+0

Wahrscheinlich Ihre Distribution ein automatisches Update tat, weil es jetzt eine Woche in meiner Maschine gewesen ist, und keine Wunderheilungen haben sich noch manifestiert. :/ – dimitarvp

+0

Ich hatte das gleiche Problem mit dir. Ich kopiere das Makefile von http://www.tldp.org/LDP/lkmpg/2.6/html/lkmpg.html. Es hat beim ersten Mal nicht funktioniert. Dann habe ich ein Makefile benutzt, das ich vorher geschrieben habe. Seltsam, dann benutze ich es wieder Es funktioniert! Ich habe keine Ahnung, warum es funktioniert. – louxiu

0

Auf der Maschine, die versagt Ist in Ihrer .config die Modulunterstützung deaktiviert?

Versuchen Sie "make menuconfig" und stellen Sie sicher, dass die Modulunterstützung aktiviert ist.

+0

Es wird unterstützt – waffleman

0

Ich kann nur die Kernel Build-Umgebung ist verpfuscht erraten, denn es geht sowohl die theoretische Prüfung (das Aussehen der Entwickler) sowie die praktische Prüfung:

make -C /lib/modules/2.6.36-rc8-32-desktop/build M=/dev/shm modules 
make[1]: Entering directory `/usr/src/linux-2.6.36-rc8-32-obj/x86_64/desktop' 
make -C ../../../linux-2.6.36-rc8-32 O=/usr/src/linux-2.6.36-rc8-32-obj/x86_64/desktop/. modules 
    CC [M] /dev/shm/hello.o 
    Building modules, stage 2. 
    MODPOST 1 modules 
    CC  /dev/shm/hello.mod.o 
    LD [M] /dev/shm/hello.ko 
make[1]: Leaving directory `/usr/src/linux-2.6.36-rc8-32-obj/x86_64/desktop' 
4

Ich verbrachte den ganzen Tag an meinem Computer klebte dieses genaue Problem .. was endete auf mysteriöse Weise verschwinden wie für OP.

Ich kann dieses mageres Detail aus meiner Erfahrung zumindest anbieten: Ich erhielt die gleiche Ausgabe wie OP (für make V = 1) und Put-Anweisungen in $ {kernel_directory} /scripts/makefile.build zeigten, dass obj- m wurde seltsamerweise NICHT eingestellt, nachdem ich mein Makefile aufgenommen hatte, obwohl es wie oben eindeutig getippt war.

Ich habe ein paar herumalbern mit der Linie "obj-m + = Hallo.o" und die um ihn herum. Irgendwann klappte es magisch, obwohl es am Ende genauso aussah wie zuvor. Vielleicht hatte ich diese Zeilen aus einem Tutorial online kopiert und es enthielt eine Art ungültiges/falsches Zeichen?

Für alle diese erfahren, stellen Sie sicher, dass obj-m in der Tat wird immer
hello.o Wenn es auf mysteriöse Weise nicht, löschen Sie die Zeile, die Hölle der ganze Makefile, und es erneut eingeben.

Ich weiß, das ist nicht viel helfen; Ich wünschte, ich könnte reproduzieren, was passiert ist!

+0

das gleiche Problem konfrontiert ... es aufgrund der Kopie von Makefile, wenn jemand dieses Problem konfrontiert Sie bearbeiten Makefile nicht kopieren und einfügen –

+0

Danke, diese Zeile neu schreiben statt einfügen, es funktioniert auch für mich. – Jefferson

0

Ich denke, man den Inhalt des Makefile aus einem PDF oder ein HTML-Dokument kopiert. Die verwendeten Bindestriche sind etwas seltsam. Versuchen Sie einfach, die Bindestriche im Makefile zu ersetzen. es wird wie ein Zauber wirken.

obj-m = hello.o 
KVERSION = $(shell uname -r) 
all: 
     make -C /lib/modules/$(KVERSION)/build M=$(shell pwd) # <-- 
clean: 
     make -C /lib/modules/$(KVERSION)/build M=$(shell pwd) clean 
+0

Willkommen bei Stack Overflow. Das ist eine interessante These, aber ich bin mir nicht sicher, ob das hier gerechtfertigt ist. Zumindest wenn ich das in der Frage gezeigte Makefile auf einen Mac (Mac OS X 10.7.5; Firefox 15.0.1) kopiere und dann die Daten analysiere, sind alle Zeichen normales ASCII. Das soll nicht heißen, dass es nicht passiert; "intelligente Zitate" können sicherlich Kummer verursachen. Ich sehe einfach keine Grundlage dafür, diese Annahme mit dieser Frage zu machen. (Wenn die Bindestriche keine Bindestriche sind, würde sich der Compiler darüber beschweren, keine Dateien mit Namen zu finden, die mit den Nicht-Bindestrichen beginnen; das ist nicht das Problem AFAICS). –

+0

Ich habe gerade geteilt, was mit mir passiert ist. Ich habe den Inhalt des Makefiles von einem PDF-Dokument in mein Makefile kopiert, das in Ubuntu-11.10 über vim geöffnet wurde. Dort waren die kopierten Bindestriche ungültige Zeichen. – saai63

0

Try modules String aus dem Makefile zu entfernen. Ich habe mich nicht mit den Details beschäftigt, aber etwas im Modul-Build-Prozess mochte meine alternative grep-Ausgabe nicht (einschließlich Dateiname und Zeilennummer). Entfernen der GREP_OPTIONS-Umgebungsvariablen fixierte Dinge direkt.

1

Ich lief in das gleiche Problem und für mich wurde, indem man die Standard grep Optionen über die GREP_OPTIONS Umgebungsvariable verursacht:

1

Dies geschieht, weil, wenn Sie die Make-Datei Inhalte aus dem PDF oder anderen Tutorial Websites und es verwenden, kopieren, wie es ist. Während Sie einen Copy-Paste-Vorgang ausführen, wird der Inhalt in der Linux-Umgebung etwas seltsam aussehen. dh; Einige Sonderzeichen Probleme werden da sein. Wenn Sie den Inhalt in der Linux-Umgebung erneut eingeben und einen make ausführen, sollte dies funktionieren.

1

In einem anderen Thread fand ich, dass, wenn ich den Make-Datei Inhalt eingefügt Kopie wurde die C nach make den falschen Verwendung von Symbol „-“ und ich hatte Typen es erneut. Es passiert einfach, dass dies für die obj-m + = ... Zeile oben der Fall ist. Sie müssen das Zeichen erneut eingeben, um es gültig zu machen. Dies sollte hoffentlich jeder finden, der dem Hallo Welt-Modul-Tutorial folgt.

+0

Ich denke, das ist die wahre Lösung des Problems. Falscher "-" Charakter! – Siggy1000

0

konnte ich dieses Problem lösen, indem diekbuild namens

obj-m += <module name>.o 

In einer separaten Datei setzen. Siehe Linux/documentation/kbuild/modules.txt für einen Hinweis, warum das funktionieren könnte

0

Ich hatte das gleiche Problem. Schließlich habe ich den Kernel neu erstellt und das Makefile neu geschrieben. Es hat endlich funktioniert.

Ich denke, der Hauptgrund ist, weil ich M = $ (PWD) Module in der folgenden Zeile hatte direkt nach dem ARCH = Arm macht ...