Hallo,
ich versuche seit ein paar Tagen ein selbst geschriebenes Kernel-Modul
für ein eigebettetes System mit ARM-Architektur zu Kompilieren. Hier ist
ein link zu dem System:
http://www.rocketboards.org/foswiki/Documentation/ArrowSoCKitEvaluationBoard
Ich kann das Modul unter Kubuntu Kompilieren, jedoch kann ich das Modul
auf dem System nicht laden. Es kommt der Fehler, dass das Modul nicht
kompatibel ist.
Könnt ihr mit ein paar Tips für das Cross-Compiling geben?
Hier das Modul zum testen:
1
#include<linux/init.h>
2
#include<linux/module.h>
3
MODULE_LICENSE("Dual BSD/GPL");
4
5
staticinthello_init(void)
6
{
7
printk(KERN_ALERT"Hello, world");
8
return0;
9
}
10
11
staticvoidhello_exit(void)
12
{
13
printk(KERN_ALERT"Goodbye, cruel world\n");
14
}
15
16
module_init(hello_init);
17
module_exit(hello_exit);
und hier das Makefile:
1
obj-m := hello.o
2
3
KERNEL_SRC_DIR=/home/tobi/linux-socfpga
4
PWD=$(shell pwd)
5
6
all:
7
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -C $(KERNEL_SRC_DIR) \
8
M=$(PWD) modules
9
10
clean:
11
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -C $(KERNEL_SRC_DIR) \
12
M=$(PWD) clean
unter /home/tobi/linux-socfpga befinden sich die Kernel Sources aus
git://git.rocketboards.org/linux-socfpga.git zusätzlich habe ich die
Linearo ARM toolchain hinzugefügt.
Wenn du das Modul für ARM kompiliert hast, kannst du es doch nicht auf
deinem Development-PC laden. Du musst das schon auf dem ARM-Board laden!
Gruß
Marius
Ich hab das schon so verstanden, daß Tobi das Modul auf dem Zielsystem
laden wollte.
Wie sieht denn die Fehlermeldung genau aus?
Was gibt den "uname -a" auf dem Zielsystem aus?
Hast Du mal versucht den kompletten Kernel (mit deinem Modul) zu
kompilieren?
Den gesamten kernel mit modul habe ich noch nicht versucht zu
kompilieren.
Hier die Ausgabe von modinfo:
filename: /home/tobi/kernel-module/hello.ko
license: Dual BSD/GPL
depends:
vermagic: 3.9.0-00161-ged01b8c SMP mod_unload ARMv7 p2v8
Ich habe die vermutung, dass die Kernelversion des Ziesystems nicht mit
den Kernel-Sources übereinstimmen. Ich habe vorher ein fertiges Image
genutz. Jetzt wollte ich den Kernel usw. nach der Anleitung:
http://zhehaomao.com/blog/fpga/2013/12/24/sockit-2.html
neu Kompilieren. Jetzt hänge ich bei Schritt 5 und nach den Ausführen
von make kommt dieser Fehler:
>>> toolchain-external undefined Configuring
Cannot execute cross-compiler
'/home/tobi/linaro/bin/arm-linux-gnueabihf-gcc'
make: ***
[/home/tobi/buildroot/output/build/toolchain-external-undefined/.stamp_c
onfigured] Error 1
Jedoch existiert die Option Set “External toolchain header series” to
“3.1.x” unter Buildroot nicht
Tobi schrieb:> Ich habe die vermutung, dass die Kernelversion des Ziesystems nicht mit> den Kernel-Sources übereinstimmen
Das sagt Dir der Kernel ganz genau, wenn Du versuchst des Modul zu
laden. Was gibt denn die Ausgabe von dmesg?
Frank
Tobi schrieb:> Es kommt die Meldung:> hello: version magic '3.9.0-00161-ged01b8c SMP mod_unload ARMv7 p2v8 '> should be '3.9.0 SMP mod_unload ARMv7 p2v8 '
Damit ist es keine Vermutung mehr :-) Die Kernel haben verschiedene
Versionsangaben.
Entweder baust Du Dein Modul mit der passenden Versionsangabe, oder Du
baust einen neuen kompletten Kernel.
Welche Linux-Distribution verwendest Du denn? In aktuellen Ubuntus gibt
es die ARM-Toolchain in der Repository. Da brauchst Du das
Buildroot-Geraffel nicht.
Tobi schrieb:> Den gesamten kernel mit modul habe ich noch nicht versucht zu> kompilieren.> Hier die Ausgabe von modinfo:> filename: /home/tobi/kernel-module/hello.ko> license: Dual BSD/GPL> depends:> vermagic: 3.9.0-00161-ged01b8c SMP mod_unload ARMv7 p2v8
Du hat ein Modul mit "git Kennung" compiliert.
Bitte mal
General Setup->Local version
deaktivieren.
Das Modul und Kernel müssen die gleiche Version haben
Die git Kennung wird per Kconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
in
General Setup->Local version
in deinem Kernelsourcen geändert, nicht dort wo du deine ggf.
Modulsourcen hast.
Also bei dir in
/home/tobi/linux-socfpga
Dein Makefile vom Modul z.B. in /home/tobi/kernel-modul "springt" da
rein.
Was du aber auch machen kannst, ist dir einfach einen lokalen Branch zu
erzeugen.
Dann kannst du das Modul und Kconfig/Makefiles anpassen.
was ich noch vergessen habe zu sagen:
Tobi schrieb:> Den gesamten kernel mit modul habe ich noch nicht versucht zu> kompilieren.> Hier die Ausgabe von modinfo:> filename: /home/tobi/kernel-module/hello.ko> license: Dual BSD/GPL> depends:> vermagic: 3.9.0-00161-ged01b8c SMP mod_unload ARMv7 p2v8
ged01b8c
sagt aus das dein aktueller HEAD von den Kernelsourcen beim hash
"ed01b8c" liegt.
Wenn ich die andere Zahl 00161 richtig deute sind zwischen Version 3.9.0
und deinem aktuellen HEAD 161 Commits.
zu sehem mit
git log --oneline v3.9.0..HEAD | wc
ggf.
git log --oneline v3.9..HEAD | wc
Ich habe glaube ein Brett vorm Kopf und vertehe nicht so ganz wie ich
Makefile und Kconfig der Kernel Sources anpassen soll. Ich habe leider
nicht so viele Erfahrungen mit Makfiles und der Kernelkompilierung unter
Linux
Wie Hans Ulli schon schrieb:
cd /home/tobi/linux-socfpga
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
Dann unter
General Setup->Local version
die lokale Version löschen.
Danach baust Du Deine Modul einfach noch einmal.
AAAHH OK das komische war, dass ich es vorher ausprobiert habe und
jedesmal eine Fehlermeldung kam. Jetzt hat es geklapt jedoch ist jetzt
ein + zu viel :(
3.9.0+ SMP mod_unload ARMv7 p2v8 ' should be '3.9.0 SMP
mod_unload ARMv7 p2v8
Tobi schrieb:> AAAHH OK das komische war, dass ich es vorher ausprobiert habe und> jedesmal eine Fehlermeldung kam. Jetzt hat es geklapt jedoch ist jetzt> ein + zu viel :(>> 3.9.0+ SMP mod_unload ARMv7 p2v8 ' should be '3.9.0 SMP> mod_unload ARMv7 p2v8
Hä? Wo kommt denn das + her?
Was gibt denn
grep CONFIG_LOCALVERSION /home/tobi/linux-socfpga/.config aus?
In der .config steht:
#
# General setup
#
CONFIG_INIT_ENV_ARG_LIMIT=32
CONFIG_CROSS_COMPILE=""
CONFIG_LOCALVERSION=""
# CONFIG_LOCALVERSION_AUTO is not set
CONFIG_HAVE_KERNEL_GZIP=y
CONFIG_HAVE_KERNEL_LZMA=y
CONFIG_HAVE_KERNEL_XZ=y
CONFIG_HAVE_KERNEL_LZO=y
CONFIG_KERNEL_GZIP=y
# CONFIG_KERNEL_LZMA is not set
# CONFIG_KERNEL_XZ is not set
# CONFIG_KERNEL_LZO is not set
CONFIG_DEFAULT_HOSTNAME="(none)"
CONFIG_SWAP=y
CONFIG_SYSVIPC=y
CONFIG_SYSVIPC_SYSCTL=y
# CONFIG_POSIX_MQUEUE is not set
# CONFIG_FHANDLE is not set
# CONFIG_AUDIT is not set
CONFIG_HAVE_GENERIC_HARDIRQS=y
Unter CONFIG_LOCALVERSION war zu beginn nichts eingetragen. Jedoch ist
durch die änderung von Automatically append version information to the
verson string konnte ich das "-00161-ged01b8c" entfernen, was durch das
+ ausgetauscht wurde.
Ich hatte das Problem auch mal. Kernel und Modul müssen von der gleichen
Version kompiliert werden. Schon ein andere Buchstabe in den Strings,
und nichts geht mehr.
Ich habe es ein paar Stunden mit Patchen versucht, und da von einem
Problem zum nächsten gekommen.
Und so richtig komfortabel war es auch nicht.
Letztendlich habe ich ein Buildsystem komplett aufgesetzt, und damit
zuerst den Kernel, und danach das Modul kompiliert. Dann passt alles
zusammen.
Und Kernel kompilieren dauert zwar etwas, ist aber auch nur ein 'make'.
Heureka!!!
Ich habe jetzt die Stelle gefunden, wo das + hinzugefügt wird :) in den
Script setlocalversion stand:
# scm version string if not at a tagged commit
if test "$CONFIG_LOCALVERSION_AUTO" = "y"; then
# full scm version string
res="$res$(scm_version)"
else
# append a plus sign if the repository is not in a clean
# annotated or signed tagged state (as git describe only
# looks at signed or annotated tags - git tag -a/-s) and
# LOCALVERSION= is not specified
if test "${LOCALVERSION+set}" != "set"; then
scm=$(scm_version --short)
res="$res${scm:++}"
fi
fi
Kurz angepasst und jetzt läuft es :) das modul konnte ich jetzt laden.
Vielen Dank für eure Hilfe
Es geht noch einfacher als Scripte zu ändern und das .git Verzeichnis zu
löschen
git tag wochentag -a -m "Dies ist mein Wochentag"
Erzeugt ein tag mit dem Namen wochentag und gibt diesem noch eine
Nachricht
"Dies ist mein Wochentag" dazu
Hans Ulli Kroll schrieb:> git tag wochentag -a -m "Dies ist mein Wochentag"
Naja, ob das wirklich einfacher ist, als ein Verzeichnis zu löschen? :-)
rm -r .git
Aber Du hast schon Recht, Deine Lösung ist wahrscheinlich die
korrekteste (gibts das überhaupt?)
LG,
Frank
Eine eigene Frage?
Dieser Thread ist über 12 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.