Forum: PC-Programmierung Linux Kernel Module - externe Variablen


von Alexander F. (alexf91)


Lesenswert?

Hi,
ich schreibe gerade an einem Kernel Modul, das ich in mehrere Source 
Files aufgeteilt habe.
Für Debugausgaben habe ich jetzt einen Parameter deklariert:
1
bool debug;
2
module_param(debug, bool, S_IRUGO);

Diesen Parameter möchte ich aber in mehreren Source Files benutzen, also 
habe ich ihn dort als "extern bool debug" deklariert.
Dennoch erhalte ich die Warnung
1
WARNING: "debug" [<path to build directory>/mymodule.ko] undefined!
und insmod bricht mit
1
insmod: error inserting 'mymodule.ko': -1 Unknown symbol in module
ab.

Wie kann ich das Problem lösen?

: Verschoben durch Moderator
von hunz (Gast)


Lesenswert?

Probier doch mal EXPORT_SYMBOL(debug)
Ich würd dir aber raten das Symbol von debug in meinmodul_debug 
umzubenennen, irgendwo im kernel namensraum gibt es vermutlich schon ein 
Symbol mit dem generischen Namen "debug".

von hunz (Gast)


Lesenswert?

Andererseits: wenn es das Symbol im kernelspace schon gäbe käme die 
Meldung wohl nicht ;) Trotzdem sind sinnvolle globale Namen sinnvoll.

von Alexander F. (alexf91)


Lesenswert?

Bringt keine Besserung.
Soweit ich weiß, überprüft insmod beim Laden des Moduls, ob das Symbol 
schon exportiert wurde.
Bei mir würde debug aber erst nach dem Laden exportiert werden.

Mein Ziel wäre eigentlich, das Problem bereits beim Kompilieren zu 
beseitigen, ohne die Variable gleich für den ganzen Kernel sichtbar zu 
machen.

von hunz (Gast)


Lesenswert?

Achso, das soll alles in ein kernelmodul.
Wie sieht denn dein Makefile aus?

von Hans Ulli K. (Gast)


Lesenswert?

Wenn ich das richtig verstanden habe, hast du z.B, drei Kernelmodule.
eins.ko
zwei.ko
drei.ko

du willst jetzt die Variable "debug" in allen sichtbar haben. Das geht 
denn so, das du das Modul zuerst laden musst wo die Variable definiert 
ist.

Achja die Variable ist zwangsläufig im Kernel sichtbar.

von Alexander F. (alexf91)


Lesenswert?

Ja genau, das soll ein einziges Modul werden.
1
# Context dependent makefile that can be called directly and will invoke itself
2
# through the kernel module building system.
3
KERNELDIR=/usr/src/linux
4
5
ifneq ($(KERNELRELEASE),)
6
7
EXTRA_CFLAGS+=-I $(PWD) -Iinclude -ARCH=um
8
obj-m := mymod.o
9
mymod-objs := kdebug.o
10
11
else
12
13
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
14
PWD = $(shell pwd)
15
16
all:
17
  $(MAKE) V=1 ARCH=um -C $(KERNELDIR) -Iinclude M=$(PWD) modules
18
19
clean:
20
  rm -rf Module.symvers .*.cmd *.ko .*.o *.o *.mod.c .tmp_versions *.order
21
22
endif

Das ist mein Makefile.
Für eine einzige c-Datei hat das funktioniert. Hinzugefügt habe ich dann 
mymod-objs := kdebug.o sowie zweimal -Iinclude

In kdebug.c ist die Varible debug als extern deklariert.

von hunz (Gast)


Lesenswert?

Hast du eine mymod.c ?
Dann muss mymod-objs denke ich mymod-objs := kdebug.o mymod.o heissen. 
[1]

Weniger irritierend wäre dann mymod.c in irgendwas.c umzubenennen, dann 
sollte auch das gehen:

obj-m := mymod.o
mymod-objs := kdebug.o irgendwas.o

[1] http://www.tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN351

von Alexander F. (alexf91)


Lesenswert?

Danke!
Das mit dem umbenennen hat geklappt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.