Linux Kernel Module - externe Variablen

OP #3501426
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?
Gast #3501448
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".
OP #3501469
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.
Gast #3501491
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.
OP #3501497
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren