Einzelnes Modul kompilieren

A

Alarich

Tripel-As
[gelöst] Einzelnes Modul kompilieren

Hallo zusammen,

ich versuche grade, in meinem Rechner eine Advansys-SCSI-Karte unter SuSE 10.1 zum Laufen zu bringen. Unter SuSE 9.2 konnte ich den Treiber in "make menuconfig" anwählen und dann mit "make modules" kompilieren lassen. Daraufhin gab es dann ein einzelnes Modul namens "advansys.ko", das dann über "modprobe advansys" geladen werden konnte und die Karte lief. Das Problem ist nur, in "make menuconfig" taucht der Treiber nicht mehr auf, aber in den Kernel-Sourcen von Linux ist er dabei. Das heißt dann, daß man ihn grundsätzlich kompilieren kann, denke ich, oder liege ich falsch?
Wie schaffe ich es nun das einzelne Modul zu kompilieren bzw. wo muß ich schauen, welchen Befehl ich brauche? Unter google gibt es einiges zu dem Thema, bloß betrifft das immer andere Module, daher weiß ich nicht, ob das übertragbar ist...

Für ein paar Tips wäre ich Euch echt dankbar, langsam bin ich ratlos.

Merci einstweilen,

Alarich

Aktualisierung 14:30:

Ich habe es zwischenzeitlich geschafft eine Datei namens advansys.o zu erzeugen. Ich bin wie folgt vorgegangen:

Code:
The second method involves the following steps:

  (1)  Install kernel-source.$ARCH.rpm.

  (2)  Install kernel-syms.$ARCH.rpm. This package is necessary for
       symbol version information (CONFIG_MODVERSIONS).

  (3)  Compile the module(s) by changing into the module source directory
       and typing ``make -C /usr/src/linux-obj/$ARCH/$FLAVOR M=$(pwd)''.
       Substitute $ARCH and $FLAVOR with the architecture and flavor
       for which to build the module(s).

       If the installed kernel sources match the running kernel, you
       can build modules for the running kernel by using the path
       /lib/modules/$(uname -r)/build as the -C option in the above
       command. (build is a symlink to /usr/src/linux-obj/$ARCH/$FLAVOR).

       Starting with SuSE Linux 9.2 / SLES9 Service Pack 1, the
       modversion information for the running kernel is also
       contained in the kernel-$FLAVOR packages, and so for building
       modules for the running kernel, the kernel-syms package is no
       longer required.

  (4)  Install the module(s) with
       ``make -C /usr/src/linux-obj/$ARCH/$FLAVOR M=$(pwd) modules_install''.

Mein Problem ist, wie bekomme ich jetzt eine Datei namens advansys.ko? Die kann ich dann ja in das Verzeichnis /lib/modules kopieren, dann müßte sie doch erkannt werden, oder?

Schlau werde ich leider nicht aus dem folgendem Absatz:

Code:
If the installed kernel sources match the running kernel, you
       can build modules for the running kernel by using the path
       /lib/modules/$(uname -r)/build as the -C option in the above
       command. (build is a symlink to /usr/src/linux-obj/$ARCH/$FLAVOR).

Was ist hier durch was zu ersetzen? Kennt sich da vielleicht jemand von Euch aus? :hilfe2:
 
Zuletzt bearbeitet:
Benutze einfach anstatt
Code:
make -C /usr/src/linux-obj/$ARCH/$FLAVOR M=$(pwd)
den build-Pfad deiner Module, also
Code:
make -C /lib/modules/$(uname -r)/build M=$(PWD)
sofern die installierten Kernel-Quelltexte mit deinem laufenden Kernel versionsmaessig uebereinstimmen. Natuerlich auch den 'make install'-Befehl entsprechend anpassen.
Wenn keine .ko-Datei erstellt wurde, wurde offenbar das make nicht beendet. Welche Meldungen kamen denn da am Ende?
 
Ich habe folgenden Befehl benutzt:

Code:
make -C /usr/src/linux-obj/$ARCH/$FLAVOR M=$(pwd) advansys

Ohne den Zusatz advansys hat er zwar kompiliert, aber keine Datei advansys.o produziert.

Danach kam folgende Fehlermeldung:

Code:
advansys.c:(.init.text+0x3059): undefined reference to `kfree'
advansys.c:(.init.text+0x3072): undefined reference to `kfree'
advansys.c:(.init.text+0x309f): undefined reference to `kfree'
advansys.c:(.init.text+0x30c3): undefined reference to `free_dma'
advansys.c:(.init.text+0x30d2): undefined reference to `kfree'
advansys.c:(.init.text+0x30e5): undefined reference to `free_irq'
advansys.c:(.init.text+0x30ec): undefined reference to `scsi_unregister'
advansys.c:(.init.text+0x3129): undefined reference to `ioport_resource'
advansys.c:(.init.text+0x312e): undefined reference to `__check_region'
advansys.o: In function `exit_this_scsi_driver':
advansys.c:(.exit.text+0xc): undefined reference to `scsi_remove_host'
advansys.c:(.exit.text+0x73): undefined reference to `printk'
advansys.c:(.exit.text+0x78): undefined reference to `dump_stack'
advansys.c:(.exit.text+0x97): undefined reference to `scsi_unregister'
collect2: ld returned 1 exit status
make[2]: *** [advansys] Error 1
make[1]: *** [advansys] Error 2
make: *** [advansys] Error 2
make: Leaving directory `/usr/src/linux-2.6.16.13-4-obj/i386/default'

Liegt der Fehler in der advansys.c Datei? Ich werde die zwei Treiberdateien mal in den Anhang stellen.

Immerhin habe ich schon mal eine .o - Datei, es kann ja nicht mehr weit sein, oder? Hoffe ich doch mal...
 

Anhänge

  • advansys.tar.gz
    138,2 KB · Aufrufe: 0
Wenn Du sagst, dass die Quelle fuer den Treiber zwar im Kernel vorliegt, jedoch Du mit 'make menuconfig' keine Option siehst, so liegt das vermutlich daran, dass der Treiber von anderen Modulen/ Treibern abhaengt, die nicht aktiviert sind. Darauf weisen auch die 'undefined references' beim Kompilieren hin. Es scheint etwas mit SCSI zu tun zu haben, also such dort mal nach.
Am Ende solltest Du ein advansys.ko haben, nicht '.o'!

P.S.: Welche Kernelversion benutzt Du ueberhaupt? Bei 2.6.8 (Debian Sarge) ist das Modul unter 'Device Drivers' -> 'SCSI device support' -> 'SCSI low-level drivers' zugaenglich.
 
Ich benutze SuSE 10.1 mit Kernel-Version 2.6.16.13-4. Unter SuSE 9.2 konnte man den Treiber auch ganz leicht einbinden, weil er unter "make menuconfig" verfügbar war. Dann halt das Übliche, "make modules" und dann "make modules_install". Modul "advansys" hinzugefügt, fertig.
Gibt es vielleicht ein anderes Modul, mit dem die Karte laufen könnte? Ansonsten muß ich halt im Notfall bei Ebay mal nach einer anderen Karte schauen...

Ich habe jetzt mal nur "make" im Verzeichnis der Datei "advansys.o" ausgeführt, aber auch ohne Erfolg. :headup:
 
Schreib mal in /lib/modules/`uname -r`/build/.config in eine Zeile
Code:
CONFIG_SCSI_ADVANSYS=m
rein und versuch es dann nochmal mit einem make in dem Verzeichnis.

Im Makefile von /lib/modules/`uname -r`/build/drivers/scsi wird diese Variable abgefragt, um advansys.ko zu bauen.
/EDIT

Hab das grade mal ausprobiert - es funktioniert so nicht. Was funktionierte, ist Folgendes:
Code:
make menuconfig # konfiguriere Deinen Kernel, ohne auf advansys zu achten
make                       # baue kernel und Module
make CONFIG_SCSI_ADVANSYS=m drivers/scsi/advansys.ko

Dies erzeugt zumindest ein advansys.ko, das Du Dir dann nach /lib/modules/`uname-r`/kernel/drivers/scsi/ oder sokopieren kannst.
Nach einem 'depmod' sollte es mit 'modprobe advansys' einzubinden sein.

Ich konnte es nicht eibinden, da ich das Geraet ja nicht habe, aber probiere es mal aus
 
Zuletzt bearbeitet:
Super, danke erstmal für den Tip!
Bin zwischenzeitlich in der Arbeit, kann Deinen Tip also erst ausprobieren, wenn ich wieder daheim bin. Ich melde mich wieder, wenn ichs probiert habe.

Danke schonmal soweit,

Alarich
 
Autsch, autsch, autsch... Einfach so die .config des Kernels editieren ohne zu wissen, was man da macht und ohne die Abhaengigkeiten auch anzuschalten duerfte ziemlich schief gehen. Die Meldung
Code:
advansys.c:(.init.text+0x309f): undefined reference to `kfree'
weist fuer mich eher darauf hin, dass die Kernel-Quelltexte nicht vorkompiliert wurden, da kfree() eine der Grundfunktionen des Kernels ist. Also einfach die Kernel-Quelltexte installieren, das Kernel-Source-Verzeichnis (normalerweise /usr/src/linux-`uname -r`) nach /usr/src/linux verlinken, in dieses Verzeichnis wechseln, die Datei /boot/config-`uname -r` nach /usr/src/linux/.config kopieren, 'make oldconfig' ausfuehren, 'make all' durchlaufen lassen und dann nochmal versuchen.
 
Das unterhalb des 'EDIT' in meinem Beitrag ist eine vollstaendige Amleitung. Dabei braucht man nicht mehr mit der .config rumpfuschen.
 
Hallo nochmal,

ich habe es mit Eurer Hilfe jetzt tatsächlich geschafft, das Modul zu kompilieren und einzubinden. Die SCSI-Karte geht und damit auch mein Scanner! Da mach ich gleich mal einen Luftsprung :bounce:
Ich bin nach der Methode von rikola vorgeganden, wie er nach dem EDIT geschrieben hat. Config-Files waren keine anzupassen. Die drei Befehle haben einwandfrei funktioniert :respekt: Besonderen Dank an rikola!

Vielen Dank auch an alle anderen, die mir Lösungsvorschläge gepostet haben, ohne Euch hätte ich das nicht hinbekommen! Super!

Merci,

Alarich
 
Hallo,

nach langer Zeit poste ich hier noch mal etwas rein. Ich habe heute OpenSuSE 10.2 aufgesetzt. Dort ist das Modul advansys wieder lauffähig vorhanden. Es läßt sich leicht mit

modprobe advansys

bzw. einer Änderung in der Sysconfig

MODULES_LOADED_AT_BOOT advansys

einbinden. Die Karte wird dann erkannt und kann verwendet werden.

Für SuSE 10.1 klappt aber die obige Anleitung. Ich markiere den Thread mal als gelöst.

CU,
Alarich
 

Ähnliche Themen

Nginx als Reverse Proxy für Nextcloud und Emby

Zugriff Ubuntu 16.04. auf Freigabe 18.04. LTS nicht möglich

OpenJDK8 unter Debian7.11/sparc64/kernel 3.16 kompilieren

X startet nichtmehr

GCC Crosscompiler unter Debian Wheezy

Zurück
Oben