[C] Extern deklarieren über mehrere Daten

HCWD

Erfahrenes Mitglied
Hi Ho Leute,

hab seit Längerem ein durchgehendes Problem in C, dass ich nicht gelöst bekomme. :(

Folgende Situation. Ich möchte eine eigene Struktur in einen Treiber einpflegen. Habe eine .h Datei und dort folgende Struktur eingetragen:
Code:
struct beacon_additional{
u_int8_t *info;
u_int8_t counter;
int info_len;
struct net_device * dev_add;
}

nun habe ich eine globale Struct-Variable in einer .c Datei erstellt mit:
Code:
struct beacon_additional *add_info;
Hab dort Stück für Stück über Malloc Speicher reserviert etc. Alles lief einwandfrei.

Nun brauche ich die gleiche globale Struct-Variable in einer anderen .c Datei. Jetzt habe ich gelesen das geht über das Schlüsselwort "extern"

Habs ausprobiert mit:
Code:
extern struct beacon_additional *add_info;

Kompiliert wird es problemlos. Auch der Treiber läuft, jedoch wenn ich in dieser 2. Datei auf den add_info Zeiger bspw. auf den Counter zugreifen will, um ihn zu inkrementieren. Dann wird es auch problemlos kompiliert, aber beim Laden des Modules kommt folgende Fehlermeldung in demsg:
Code:
Unknown symbol add_info

oder das System hängt sich komplett auf. Wieso passiert sowas? Wie kann ich diese Fehlermeldung beheben?

Greetz

Euer HCWD
 
Hi.

Die extern Deklaration muss in die Headerdatei, die Definition dann in eine .c Datei.

Du hast nicht genau gesagt wie das bei dir aussieht. Was für Dateien du erstellst (DLLs?) usw.

Gruß
 
Hi Ho,

also ich nutze halt den MadWIFI Treiber.

Kannst du sagen in wiefern du die Genauigkeit meinst? Also ich habe halt 2 .c Dateien und eine .h Datei, inder die Struct Deklaration drin steht.

Habe die Header auch in beide .c Dateien includiert, wenn es dir darum geht.

Könntest du etwas mir auf die Sprünge helfen, was man hier noch posten kann, um dir die Hilfe zu erleichtern. :)

Vor allem überleg ich mir grad, gilt dann auch die Deklaration des Struct-Pointers add_info als global? ich mein eigentlich von meinem Verständnis müsste es so sein, ich wollte nochmal es nur bestätigt bekommen :)

Greetz
 
Kannst du sagen in wiefern du die Genauigkeit meinst? Also ich habe halt 2 .c Dateien und eine .h Datei, inder die Struct Deklaration drin steht.
Was steht wo drin? Was wird wie eingebunden? Wie werden die Dateien kompiliert? Etc.
Könntest du etwas mir auf die Sprünge helfen, was man hier noch posten kann, um dir die Hilfe zu erleichtern. :)
Code.
Vor allem überleg ich mir grad, gilt dann auch die Deklaration des Struct-Pointers add_info als global?
Natürlich. Du hast es im globalen Skopus deklariert.

Gruß
 
Also es lag an der Deklarierung statt in der .c-Datei in die .h Datei. Dort habe ich nun das extern reingeschrieben. Läuft alles perfekt... Vielen Dank ^^
 
Also ich hab jetzt immer noch ein Problem. Diesmal aber ein anderes. Ich habe jetzt entsprechend die extern Deklarierung zum Laufen gebracht. Aber wenn ich jetzt auf ein Feld der externen Struktur zugreife (sei es add_info->counter // u_int8_t), hängt sich mein System auf.
Ich sollte noch hinzufügen, dass es sich hier um eine Struktur im Treiber handelt, die in einem Interrupt aufgerufen wird.

Weiß da jemand Rat?

//EDIT: Also mit der Lösung die Struktur-Variable im .h bereits extern zu definieren, klappt nicht, da in der 2. .c-Datei die Variable nicht die von der 1. .c-Datei ist, da über if(add_info != NULL) die if-Anweisung nicht ausgeführt wird. Irgendwie klappt das nicht so ganz.... :(
 
Zuletzt bearbeitet:
Hi.

Ist es denn zuviel verlangt den entsprechenden Code hier mal zu posten?

Wenn man es richtig macht, dann funktioniert es auch.

Gruß
 
Ich habe 2 Möglichkeiten bereits ausprobiert. Bei der 1. kompiliert er alles einwandfrei, nur da ist mir aufgefallen, das aus der Datei 2.c der Zeiger ein anderer sein muss, als aus der Datei 1.c, da ich ihn mit if(add_info == NULL) überprüfe und er dann in die If reinspringt:

Die hier ist aus der Datei 2.c:
Code:
struct beacon_additional *add_info;

Dies ist aus der Datei def.h
Code:
struct beacon_additional{
	u_int8_t *info;
	u_int8_t counter;
	int info_len;
	struct net_device * device_additional; };
extern struct beacon_additional *add_info;

Dies ist aus der Datei 1.c:
Code:
struct beacon_additional *add_info = NULL;
[... //Weiter unten in einer Funktion]
add_info = kzalloc(sizeof(struct beacon_additional), GFP_KERNEL);


Hier die 2. Möglichkeit, die ich ausprobiert hatte. Hier meint er beim Laden des Moduls im dmesg: Unknown Symbol add_info

Die hier ist aus der Datei 2.c:
Code:
extern struct beacon_additional *add_info;

Dies ist aus der Datei def.h
Code:
struct beacon_additional{
	u_int8_t *info;
	u_int8_t counter;
	int info_len;
	struct net_device * device_additional; };

Dies ist aus der Datei 1.c:
Code:
struct beacon_additional *add_info = NULL;
[... //Weiter unten in einer Funktion]
add_info = kzalloc(sizeof(struct beacon_additional), GFP_KERNEL);

Hoffe, das ist so ok?
 
Hi.

Wie bereits gesagt, muss die extern Deklaration in die Headerdatei und die Definition in eine C-Datei. Die Headerdatei mußt du natürlich in beide C-Dateien einbinden. Deine 2. Variante sollte auch funktionieren, ist allerdings weniger schön.

Welche Symbole sind sind in dem Modul enthalten?
Code:
nm *.ko

Bist du sicher das du auch das aktuelle Modul verwendest und auch die Dateien neu erstellt wurden?

Gruß
 
Also ich habe jetzt durch den befehl, den du mir gepostet hast folgenden Ausschnitt gefunden:

[...]
00003f60 t _take_txbuf_locked
U add_info
U alloc_etherdev_mq
[...]

Das heißt doch, add_info sollte doch exisiteren oder? Kenne den Befehl nicht, deswegen kann ich das Ergebnis auch nicht interpretieren.

Aber ich habe nun folgendes umgeändert so wie du es genannt hast:
def.h:
Code:
struct beacon_additional{
	u_int8_t *info;
	u_int8_t counter;
	int info_len;
	struct net_device * device_additional; };
extern struct beacon_additional * add_info;

1.c:
Code:
if(add_info != NULL) [...]

2.c:
Code:
struct beacon_additional *add_info = NULL; 
[...]
add_info = kzalloc(sizeof(struct beacon_additional), GFP_KERNEL);

Habe natürlich die def.h in beide c-Dateien includet. Jedoch erscheint der gleiche Fehler. Trotzdem kommt immer noch der gleiche Fehler mit dem unknown Symbol add_info

Vielleicht sollte ich noch zusätzlich sagen, dass def.h und 1.c in einem Ordner stecken und 2.c in einem anderen Ordner sich befindet.

Bzgl. dem korrekten Modul: Ich denke, es ist das richtige Modul, das geladen wird, da wenn ich eine Kleinigkeit ändere, die vielleicht nen Syntaxfehler raus haut, bekomme ich ihn auch angezeigt beim Kompilieren. Auch fehlerfreie Änderungen werden richtig umgesetzt. Denke daran könnte es nicht liegen. Oder? o.O
 
Zuletzt bearbeitet:
Zurück