Autor Thema: Syscall - Übungsaufgabe - Fehler  (Gelesen 6534 mal)

sence123

  • Beiträge: 8
    • Profil anzeigen
Gespeichert
« 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

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #1 am: 10. January 2010, 15:11 »
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 */
}
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

sence123

  • Beiträge: 8
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 10. January 2010, 17:28 »
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

sence123

  • Beiträge: 8
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 10. January 2010, 17:53 »
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

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #4 am: 10. January 2010, 18:49 »
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.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 10. January 2010, 19:05 »
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.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

sence123

  • Beiträge: 8
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 11. January 2010, 14:05 »
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!!!

sence123

  • Beiträge: 8
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 12. January 2010, 16:54 »
Gelöst

Ich lösche dies nicht, da dies als Hilfe anderer dienen kann.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 12. January 2010, 18:25 »
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
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

sence123

  • Beiträge: 8
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 12. January 2010, 23:35 »
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

Oberrheintux

  • Beiträge: 1
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 15. January 2010, 18:24 »
Hi,
wäre schön, wenn Du hier weiter über Dein Problem berichtest, da ich das selbe habe :cry:

 

Einloggen