Kernel-Modul Abhängigkeiten
-
Hi!
Hab nochmal ein Problem mit 'nem Kernel-Modul. Und zwar kompiliert's tadellos, ABER es lässt sich nicht mit "insmod" laden, wegen "undefined symbols". Mit "modinfo" (auf der Shell) konnte ich herausfinden, dass mein Modul von "i2c-core" abhängt (modinfo sagt irgendwas von "depends: i2c-core"). Genau das scheint auch das Problem zu sein, ich kann zwar Kernel-Funktionen wie "register_chrdev" benutzen, dann klappt insmod, sobald ich aber eine "i2c_*"-Funktion drin hab, gibt mir insmod "undefined symbols" aus.
Mein Makefile sieht so aus (anscheinend das Standard-Makefile für Module):
obj-m += treiber.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Weiß jemand Rat oder kann ein bisschen herum-raten? Ich hab nämlich keine Ahnung, wie ich mein Modul mit dieser Abhängigkeit kompiliere und im I-Net kann ich absolut nichts finden
Verzweifelt,
euer Badestrandedit: Ich hab mir mal ausgeben lassen, welche Symbole vom Kernel exportiert werden ("cat /proc/kallsyms > bla.txt"), die Symbole "register_chrdev" usw sind dabei, "i2c_*"-Funktionen nicht
Wie bekomme ich den Kernel dazu, die zu exportieren?
-
Badestrand schrieb:
edit: Ich hab mir mal ausgeben lassen, welche Symbole vom Kernel exportiert werden ("cat /proc/kallsyms > bla.txt"), die Symbole "register_chrdev" usw sind dabei, "i2c_*"-Funktionen nicht
Wie bekomme ich den Kernel dazu, die zu exportieren?
Indem Du i2c in den Kernel compilierst oder das i2c-core Modul mit insmod lädst.
Tipp: Insmod löst keine Abhängigkeiten auf, modprobe aber schon.
-
LordJaxom schrieb:
Indem Du i2c in den Kernel compilierst
Heißt das, ich muss den ganzen Kernel neu kompilieren? Würde ich eigentlich nur ungern machen
LordJaxom schrieb:
oder das i2c-core Modul mit insmod lädst.
Das würde ich gerne machen
Ein i2c-core-Modul gibt's bei mir (Ubuntu) leider nicht, dafür irgendwo bei den Sourcen den Quellcode + Makefile. "make" sagt aber nur "Keine Targets. Schluss".
LordJaxom schrieb:
Tipp: Insmod löst keine Abhängigkeiten auf, modprobe aber schon.
Im Ernst, ich hab schon mindestens 5 oder 6 Dokumentationen zu modprobe gelesen, aber anscheinend komme ich nicht damit zurecht. Mit "modprobe treiber.ko" oder auch "modprobe treiber" bekomme ich nur "FATAL: Module treiber[.ko] not found".
Tut mir Leid, wenn anscheinend wenig Eigeninitiative zeige, aber meine Nerven liegen blank. In den letzten Tagen habe ich hunderte Seiten Dokus und Tutorials durchwälzt und immer wieder stoße ich auf so bescheuerte Probleme, die ich einfach nicht lösen kann
-
Also für modprobe muss das Modul IMHO bereits in den /lib/modules-Zweig eingepflegt sein und mit depmod die Abhängigkeiten ermittelt worden sein.
Sorry, sonst kann ich Dir nicht helfen. Ich bin mir aber ziemlich sicher, dass Ubuntu auch I2C-Module hat. Vielleicht musst Du sie nachinstallieren, aber selbst das glaube ich nicht, da I2C inzwischen eine Allerwelts-Schnittstelle ist.
Was sagt denn z.B.
modprobe i2c
oderfind /lib/modules -name i2c\*
?EDIT: Nochmal zu den Modulen im Kernel selbst...
Badestrand schrieb:
Heißt das, ich muss den ganzen Kernel neu kompilieren? Würde ich eigentlich nur ungern machen
[...]
Ein i2c-core-Modul gibt's bei mir (Ubuntu) leider nicht, dafür irgendwo bei den Sourcen den Quellcode + Makefile. "make" sagt aber nur "Keine Targets. Schluss".Wenn du in die Situation kommst, etwas zu brauchen, was Dein Kernel nicht anbietet, bleibt Dir nichts anderes übrig als den Kernel oder das Modul neu zu übersetzen. Dafür geht man aber immer in das Kernelsourcen-Basisverzeichnis (nicht in das des Moduls), macht make menuconfig (oder xconfig oder qconfig oder...) und übersetzt dann entweder den kompletten Kernel (wenn Du etwas fest in den Kernel reinkonfigurieren musstest) oder nur die Module (wenn Du nur Module hinzugefügt hast). Wenn Du den Kernel selbst ändern musstest, musst Du ihn sogar noch installieren und booten.
Meist reicht es aber, Module nachzukompilieren.
Frag' mich jetzt bitte nicht nach den genauen Make-Kommandos, dafür liegen meine Kernelcompileorgien schon etwas lange zurück. make help hilft
-
LordJaxom schrieb:
Frag' mich jetzt bitte nicht nach den genauen Make-Kommandos, dafür liegen meine Kernelcompileorgien schon etwas lange zurück. make help hilft
make modules
undmake modules_install
-
LordJaxom schrieb:
Also für modprobe muss das Modul IMHO bereits in den /lib/modules-Zweig eingepflegt sein und mit depmod die Abhängigkeiten ermittelt worden sein.
Oh, gut, das erklärt schon mal einiges.
LordJaxom schrieb:
Was sagt denn z.B.
modprobe i2c
oderfind /lib/modules -name i2c\*
?modprobe i2c => "FATAL: Module i2c not found."
modprobe i2c-core => "FATAL: Could not open '/lib/modules/2.6.22-14-generic/kernel/drivers/i2c/i2c-core.ko': No such file or directory"
LordJaxom schrieb:
Wenn du in die Situation kommst, etwas zu brauchen, was Dein Kernel nicht anbietet, bleibt Dir nichts anderes übrig als den Kernel oder das Modul neu zu übersetzen. Dafür geht man aber immer in das Kernelsourcen-Basisverzeichnis (nicht in das des Moduls), macht make menuconfig (oder xconfig oder qconfig oder...) und übersetzt dann entweder den kompletten Kernel (wenn Du etwas fest in den Kernel reinkonfigurieren musstest) oder nur die Module (wenn Du nur Module hinzugefügt hast).
Gibt mir hunderte an Compiler-Fehlern *verzweifel* Irgendwie stimmt hier irgendwas nicht, es reicht aber doch eigentlich, wenn man sich Linux "normal" installiert, oder nicht?
Aber vielen Dank schonmal für die Antworten
-
supertux schrieb:
make modules
undmake modules_install
make gibt mir immer nur Fehler aus - es hasst mich
-
Gibt es evtl eine einfach Anleitung, wie ich Linux samt dem i2c-core-Modul neu installieren kann?
edit: Hab's neu installiert, läuft nun. Weiß die Hölle wieso, aber ich bin zufrieden
Danke für die Zeit und Mühe