mit gcc ein Modul schreiben

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
reneZ
Beiträge: 10
Registriert: 30.12.2004 14:07:09
Wohnort: Berlin
Kontaktdaten:

mit gcc ein Modul schreiben

Beitrag von reneZ » 30.12.2004 19:59:17

ich versuche ein kleines Modul unter „Sarge“ zu schreiben, dazu benutze ich
den „gcc version 3.3.4 (Debian 1:3.3.4-13)“

wenn ich nun gcc -c -O3 make.c compiliere bekomme ich folgende Meldung. (Auszug)

Code: Alles auswählen

base1:~/scripts# gcc -c -O3 mkdir.c
In file included from /usr/include/asm/smp.h:18,
                 from /usr/include/linux/smp.h:17,
                 from /usr/include/linux/sched.h:23,
                 from /usr/include/linux/module.h:10,
                 from mkdir.c:5:
/usr/include/asm/mpspec.h:6:25: mach_mpspec.h: No such file or directory
In file included from /usr/include/asm/smp.h:18,
                 from /usr/include/linux/smp.h:17,
mal n                 from /usr/include/linux/sched.h:23,
                 from /usr/include/linux/module.h:10,
                 from mkdir.c:5:
/usr/include/asm/mpspec.h:8: error: `MAX_MP_BUSSES' undeclared here (not in a function)
/usr/include/asm/mpspec.h:9: error: `MAX_MP_BUSSES' undeclared here (not in a function)
/usr/include/asm/mpspec.h:10: error: `MAX_MP_BUSSES' undeclared here (not in a function)
/usr/include/asm/mpspec.h:12: error: `MAX_MP_BUSSES' undeclared here (not in a function)
/usr/include/asm/mpspec.h:19: error: `MAX_APICS' undeclared here (not in a function)
Die Verweise sind jedoch richtig und die Dateien sind auch an dem entsprechenden Ort. Der C Code sollte soweit richtig sein. Den Hänge ich mal nicht mit ran, sonst wirds zu lang, Folgende include Dateien werden bei diesem Script benötigt.

Code: Alles auswählen

#define MODULE
#define __KERNEL__
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/version.h>
#include <sys/syscall.h>
leider habe ich nun überhaupt keine Idee aus welchem Grund es hier hapert, ein einfaches Programm (ala hello world) lässt sich problemloss erstelen. hat jemand eine nützliche Idee ?

Benutzeravatar
reneZ
Beiträge: 10
Registriert: 30.12.2004 14:07:09
Wohnort: Berlin
Kontaktdaten:

Beitrag von reneZ » 30.12.2004 20:20:18

sunnemer hat geschrieben:mach das ganze mal ohne .h beim include, also nur z.b. iostream
hab ich gemacht, dabei ist dan rausgekommen
mkdir.c:4:24: linux/kernel: No such file or directory
mkdir.c:5:24: linux/module: No such file or directory
Dank deiner Idee fällt mit ein, das das Script ursprünglich für den 2.2 er Kernel gebaut wurde. Leider habe ich kein "altes" System zur Hand. Die Systemcalls wurden doch unter /usr/include/asm/unisd.h definiert. Wie portiere ich es nun auf den 2.4-er? Wenn es daran liegen sollte, verzweifel ..

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 30.12.2004 20:43:23

welche Version steht in /usr/include/linux/version.h (bei mir unter sarge steht dort 2.6.0-test-7). Wahrscheinlich ist es besser, wenn du dir die Kernel-Header von 2.4.x holst und gcc mit -I<includedir> aufrufst

[edit]
sunnemer hat geschrieben:mach das ganze mal ohne .h beim include, also nur z.b. iostream
im "Normalfall" gilt das für die Header der libstdc++, aber sicher nicht für Kernelheader
[/edit]

Benutzeravatar
reneZ
Beiträge: 10
Registriert: 30.12.2004 14:07:09
Wohnort: Berlin
Kontaktdaten:

Beitrag von reneZ » 30.12.2004 21:28:33

die gleiche version .. 2.6.0-test-7
gcc -c -O3 -I/usr/src/kernel-headers-2.4.27-1/include/linux mkdir.c
hat leider die gleichen Fehler gebracht ... <not in a function>

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 30.12.2004 21:34:25

Das linux-Unterverzeichnis mußt du auf alle Fälle weglassen, da:

Code: Alles auswählen

#include <linux/kernel.h>
Daher wurden bei deinem Versuch die Headerdateien wieder von /usr/include/linux... verwendet.

Also:
gcc -c -O3 -I/usr/src/kernel-headers-2.4.27-1/include mkdir.c

Benutzeravatar
reneZ
Beiträge: 10
Registriert: 30.12.2004 14:07:09
Wohnort: Berlin
Kontaktdaten:

Beitrag von reneZ » 30.12.2004 21:40:47

veieleicht hat jemand eine bessere idee hier einfach mal der c code

Code: Alles auswählen

#define MODULE
#define __KERNEL__

#include <linux/kernel>
#include <linux/module>
#include <linux/version>
#include <sys/syscall>


*/ beim einlesen des Modules soll es nicht weiter */
*/ erlaubt sein ein mkdir zu erstellen */
 extern void* sys_call_table[];

/* der regulaere mkdir Systemcall */
int (*org_mkdir)(const *path);

/* der nene system Systemcall   */
int hack_mkdir(const char *path)
{
 printk(KERN_INFO "--> versuchte Erstellung eies Verzeichnisses\n");
 return 0;
}

/* Modul Initialisation */
int init_module(void)
{
 printk(KERN_INFO "--> mkdir Modul aktiviert\n");
 org_mkdir=sys_call_table[SYS_mkdir];
 sys_call_table[SYS_mkdir]=hack_mkdir;
 return 0;
}

/* Modul wieder freigeben */
void cleanup_module(void)
{
 printk(KERN_INFO "--> mkdir Modul beendet\");
 sys_call_table[SYS_mkdir]=org_mkdir;
}


gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 30.12.2004 21:48:54

du machst es dir ja einfach:

fehlerfrei compiliert:

Code: Alles auswählen

root@gms1:/usr/src# gcc -c -I linux-2.4.28/include test.c
neuer Sourcecode:

Code: Alles auswählen

#define MODULE 
#define __KERNEL__ 

#include <linux/kernel.h> 
#include <linux/module.h> 
#include <linux/version.h> 
#include <sys/syscall.h> 


/* beim einlesen des Modules soll es nicht weiter */ 
/* erlaubt sein ein mkdir zu erstellen */ 
 extern void* sys_call_table[]; 

/* der regulaere mkdir Systemcall */ 
int (*org_mkdir)(const *path); 

/* der nene system Systemcall   */ 
int hack_mkdir(const char *path) 
{ 
 printk(KERN_INFO "--> versuchte Erstellung eies Verzeichnisses\n"); 
 return 0; 
} 

/* Modul Initialisation */ 
int init_module(void) 
{ 
 printk(KERN_INFO "--> mkdir Modul aktiviert\n"); 
 org_mkdir=sys_call_table[SYS_mkdir]; 
 sys_call_table[SYS_mkdir]=hack_mkdir; 
 return 0; 
} 

/* Modul wieder freigeben */ 
void cleanup_module(void) 
{ 
 printk(KERN_INFO "--> mkdir Modul beendet"); 
 sys_call_table[SYS_mkdir]=org_mkdir; 
}
Zuletzt geändert von gms am 30.12.2004 21:53:40, insgesamt 1-mal geändert.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 30.12.2004 21:53:12

reneZ hat geschrieben:veieleicht hat jemand eine bessere idee ...
Oft mangelt es an der Umsetzung und nicht an der Idee :)

Benutzeravatar
reneZ
Beiträge: 10
Registriert: 30.12.2004 14:07:09
Wohnort: Berlin
Kontaktdaten:

Beitrag von reneZ » 30.12.2004 21:58:14

einfach klasse von euch, es hat geklappt *freude spring

Code: Alles auswählen

base1:~/scripts# insmod mkdir.o
Warning: loading mkdir.o will taint the kernel: no license
  See http://www.tux.org/lkml/#export-tainted for information about tainted modules
Module mkdir loaded, with warnings
hmm wo kommt das den nun her ?

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 30.12.2004 22:10:42

reneZ hat geschrieben: Warning: loading mkdir.o will taint the kernel: no license
See http://www.tux.org/lkml/#export-tainted for information about tainted modules
Module mkdir loaded, with warnings
[/code]
Das bedeutet nur, daß dieses Modul nicht von unseren Kernel Entwicklern supportet wird :)

[edit]

diese Warning wird möglicherweise durch das Einfügen dieser Zeile beseitigt:

MODULE_LICENSE("GPL");

[/edit]

Benutzeravatar
reneZ
Beiträge: 10
Registriert: 30.12.2004 14:07:09
Wohnort: Berlin
Kontaktdaten:

Beitrag von reneZ » 30.12.2004 23:22:52

och wenn das soo ist mit der License.. danke

Danke allen, für die schnelle und umfassende Hilfe,
hat nun alles nach wunsch geklappt *glücklich :D

Antworten