Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: sence123 am 10. January 2010, 15:00
-
Hallo Forum,
Ich muss für eine Übungsaufgabe einen Syscall definieren und diesen von einem C Programm aus nutzen. Das C Programm wird über ein Shellscript aufgerufen und es wird ein Parameter überreicht.
Das Problem ist die kompilierung von Gauss.c
ich herhalte den Fehler bei :
gcc Gauss.c -o gauss
gauss.c:7: error: expected declaration specifiers or ‘...’ before ‘prosys’
gauss.c:7: warning: data definition has no type or storage class
Zudem würde ich gerne Wissen ob meine Lösung stimmt ? (bin blutiger Anfänger darin)
der Syscall prosys.c :
#include <linux/linkage.h>
asmlinkage long sys_prosys(long n) {
long ergebnis=0;
int i;
for(i=1; i<=10;i++) {
ergebnis +=i;
}
ergebnis = ergebnis + n;
return ergebnis;
}
Die C Datei, welche den Syscall nutzt, Gauss.C :
# include <stdio.h>
# include <linux/unistd.h>
# include <errno.h>
# include <sys/syscall.h>
# define __NR_prosys 320
_syscall0(long, prosys);
void main(int args, char* argv[])
{
printf("Berechnung nach der Gauß-Formel \n");
printf("Die Summe ist: %d \n", prosys(argv[1]) );
}
das Shellscript brauche ich nicht hier zu posten, da dies funktioniert und auch den Parameter weitergibt. Sollte ich es dennoch posten müssen, gebt mir bitte kurz bescheid.
Vielen herzlichen Dank!!
Mit freundlichen Grüßen
Marco
-
Du musst das ganze in Deklaration und Definition aufteilen, da extern "C" (laut Internet wird aus asmlinkage exakt dieses) nicht in einer Definition auftreten darf:
asmlinkage long sys_prosys(long n);
long sys_prosys(long n){
/* bla */
}
-
Hey,
könntest du mir bitte kurz die Dateien Posten, wie du es meinst ?
hab leider sehr wenig plan davon , muss das jedoch als Übungsaufgabe für das Studium machen.
Es wurde kurz C angesprochen dann uns der Brocken mit Syscall vorgelegt.......
wenn du es mir kurz niederschreiben könntest, wäre ich dir wirklich sehr verbunden.
Dann würde ich es auch nachvollziehen können.
Vielen Dank
-
Hallo nochmal,
Also ich habe nun den prototypen (prosys.h) erstellt.
jedoch noch der selbe Fehler oO
oder hab ich noch etwas falsches vorliegen ?
danke
-
Ich hab doch eigentlich exakt das geschrieben :-o
Du musst nur deine Zeile
asmlinkage long sys_prosys(long n) {
durch
asmlinkage long sys_prosys(long n);
long sys_prosys(long n){
ersetzen.
Wenn du die Deklaration/den Prototyp in einen eigene Header packst musst du in der Header vorher auch <linux/asmlinkage.h> inkludieren, dort ist ja asmlinkage definiert.
-
gauss.c:7: error: expected declaration specifiers or ‘...’ before ‘prosys’
gauss.c:7: warning: data definition has no type or storage class
gcc kennt '_syscall0' nicht(wurde laut Google mit dem 2.6.18er-Kernel aus den Headern genommen) und geht von einer Prototypen-Deklaration aus, was dann zu einem Fehler führt weil 'prosys' kein Type ist.
Versuch es mal mit:
long prosys(void) {
return syscall(__NR_prosys);
}
statt Zeile 7.
-
Hallo,
Vielen Dank!!!!!!!!
Gauss.C funktioniert nun nice :-)
nun jedoch noch ein Problem:
ich musste ein Systemcall definieren (prosys):
#include <linux/linkage.h>
asmlinkage long sys_prosys(long n){
long ergebnis=0;
int i;
for(i=1; i<=10;i++) {
ergebnis +=i;
}
printf("Vorläufiges Ergebnis: %d \n", ergebnis);
ergebnis = ergebnis + n;
return ergebnis;
}
ich habe das Makefile erstellt
obj-y := prosys.o
dann das ganze in /usr/src/linux/linux-2.6.32-2/prosys/ abgelegt.
die ergänzungen im Globalen Makefile hinzugefügt:
core-y. += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ prosys/
gemacht.
und in der unistd.h
den Eintag #define __NR_prosys 242 hinzugefügt.
in der syscall_table32:
.long sys_prosys
wenn ich das programm Gauss ausführe erhalte ich:
als ergebnis -1
also irgendwas stimmt da noch nicht :/
Vielen Dank für die Hilfe!!!
-
Gelöst
Ich lösche dies nicht, da dies als Hilfe anderer dienen kann.
-
Ich lösche dies nicht, da dies als Hilfe anderer dienen kann.
Wenn du jetzt auch noch sagst was du falsch gemacht hast bzw. wie es richtig geht, Hilft das ganze noch mehr. :-D
-
ups sry hab noch nen problem mit dem syscall selbst :/
war happy mit Gauss.c jedoch nicht mit meinem Syscall implementieren und 64 bit systemen :////
my fault
-
Hi,
wäre schön, wenn Du hier weiter über Dein Problem berichtest, da ich das selbe habe :cry: