linux-l: unresolved symbol in einem Modul (Airlancer MC-2)

Frank Reker frank at reker.net
Do Aug 16 15:30:53 CEST 2001


Am Wed 15. Aug 2001 17:12 +0200 schrieb Martin Amberg <zwergchen at gmx.de>:

>Hallo,
>ich habe versucht den Elsa Treiber fuer die Airlancer MC-2 zu
>kompilieren, man muss dafuer einen 2.2 kernel nehmen. Das
>kompilieren der pcmcia-source klappt. Aber beim neustart kommt
>ein Fehler wenn er die modules.dep erstellt
>depmod: *** Unresolved symbols in lib/modules/2.2.19/pcmcia/wl24_cs.o
>wenn ich dann versuche das modul mit insmod zu laden kommen noch
>mehr Fehler
>/lib/modules/2.2.19/pcmcia/wl24_cs.o: unresolved symbol securebits
>/lib/modules/2.2.19/pcmcia/wl24_cs.o: unresolved symbol eth_type_trans
>/lib/modules/2.2.19/pcmcia/wl24_cs.o: unresolved symbol printk
[...]

>Was bedeutet das ueberhaupt mit diesem unresolved symbol

Nun, wenn du ein Programm schreibst, z.B. in C, dann wirst du mit
Sicherheit Funktionen benutzen, ggfs. auch globale Variablen. Der
Prozessor kann natuerlich mit Funktionsnamen reichlich wenig anfangen,
hier wird dann nur noch mit Addressen (Einsprungsaddressen) gearbeitet.
Also muessen beim Compilieren, die Namen in Addressen umgewandelt
werden, dies macht ueblicher weise der Linker. Da man aber selten
alles selber schreibt, sondern auf fertige Library-funktionen zurueck-
greift, muesste jedesmal die ganze Library oder gar mehrere mitgelinkt
werden, wodurch Programme unhandlich gross wuerden. Daher ist man 
schon vor einigen Jahren dazu uebergegangen, Programme dynamisch zu
linken. D.h. man laesst die Symbolnamen weiterhin stehen, und wenn
das Programm gestartet wird, dann wird zunaechst der Linker aufgerufen,
der dann die Symbolnamen in Addressen der jeweiligen Library umwandelt.
unresolved symbol heisst jetzt, das der Symbolname in der Library nicht
gefunden werden konnte, das kann z.B. geschehen, wenn eine andere
Libraryversion verwendet wird, als beim Compilieren vorlag.
Nun, hier arbeitest du zwar nicht mit Programmen, die mit irgendwelchen
Libraries gelinkt werden muessen, sondern mit Kernel-modulen. 
Aber auch diese muessen gelinkt werden, zwar nicht mit irgendwelchen
Libs, sondern mit dem Kernel, oder anderen Modulen. Dies geschieht
beim Aufruf von insmod, bzw. modprobe. Insmod linkt jetzt das Modul
mit dem Kernel, das setzt aber vorraus, das die noetigen Symbole im
Kernel vorhanden sein muessen. Da haeufig Module auf anderen
Modulen basieren, muessen diese zuerst geladen (gelinkt) werden.
Um die richtige Reihenfolge einzuhalten gibt es modprobe, welche
zuerst die Abhaengigkeiten zwischen den Modulen untersucht, welche
zuvor mit depmod bestimmt werden muessen, und dann die Module
automatisch in der richtigen Reihenfolge laedt.
depmod hat jetzt aber festgestellt, das einige Symbole nicht 
gegeben sind, insmod hat dir dann die Liste der Symbole ausgegben,
die fehlen. Das heisst jetzt in der Praxis, das du deinen Kernel
neu compilieren musst. Erstens handelt es sich bei deiner Karte
um eine PCMCIA-Karte, das heisst auch, das dein Kernel mit PCMCIA-
Unterstuetzung (modular oder auch nicht) compiliert werden muss,
dies scheint aber auch der Fall zu sein. Zweitens, (mir sagt zwar
Airlancer MC2 nichts, aber aus den Symbolnamen schliesse ich mal,
das es sich um eine Ethernetkarte handelt) muss dein Kernel mit
Ethernet-Unterstuetzung compiliert sein.
Aehnliche Probleme koennen aber auch auftreten, wenn dein Kernel
mit versioned symbols arbeitet, und ne falsche symboltabelle
verwendet wird. Alles klar? ;-) Also um's nochmal in normalem
deutsch zu sagen: Es gibt im Kernel die Moeglichkeit Versionsnummern
an die Symbole zu klatschen, das reduziert die fehlertraechtigkeit.
Nun, depmod muss natuerlich auch wissen, welche Symbole im Kernel
vorhanden sind. Dazu werden die Symbole beim Compilieren in die
Datei System.map geschrieben. Bei versioned symbols, jedoch kann
diese Datei nicht verwendet werden, statt dessen sollte man eine
Kopie von /proc/ksyms verwenden.
Mach jetzt mal folgendes: 
cat /proc/ksyms > ksymtab
depmod -F ksymtab -e
und mail mal die Ausgabe, dann kann man eher sagen, was konkret
fehlt. Denn besonders ``unresolved symbol printk'' scheint mir
sehr mysterioes, da printk eigentlich immer im Kernel vorhanden ist.


-- 
Don't worry, be happy...
Ciao tex
-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : nicht verfügbar
Dateityp    : application/pgp-signature
Dateigröße  : 232 bytes
Beschreibung: nicht verfügbar
URL         : <https://mlists.in-berlin.de/pipermail/linux-l-mlists.in-berlin.de/attachments/20010816/ec2796ad/attachment.sig>


Mehr Informationen über die Mailingliste linux-l