почему я получаю эти синтаксические ошибки при попытке реализовать системный вызов - PullRequest
0 голосов
/ 24 октября 2010

все еще работает над этим системным вызовом !!!

Я добавил системный вызов в ядро, скомпилировал и ОС запускает его.

теперь я получаю синтаксическую ошибку при компиляции моего тестового приложения.

testmycall.h

#include<linux/unistd.h>

#define __NR_mycall 244

_syscall1(long, mycall, int, i)

testmycall.c

#include<stdio.h>

#include "testmycall.h"

int main(int argc, char *argv[])

{

    printf("%d\n", mycall(15));

}

вот ошибка

stef@ubuntu:~$ gcc -o testmycall testmycall.c
In file included from testmycall.c:3:
testmycall.h:7: error: expected ‘)’ before ‘mycall’
stef@ubuntu:~$ gcc -o testmycall testmycall.c
In file included from testmycall.c:3:
testmycall.h:7: error: expected declaration specifiers or ‘...’ before ‘mycall’
testmycall.h:7: error: expected declaration specifiers or ‘...’ before ‘i’
testmycall.c: In function ‘_syscall1’:
testmycall.c:7: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
testmycall.h:7: error: parameter name omitted
testmycall.h:7: error: parameter name omitted
testmycall.c:11: error: expected ‘{’ at end of input
stef@ubuntu

я добавил в системный вызов вместо _syscall1

теперь я получаю эту ошибку

stef@ubuntu:~$ gcc -o testmycall testmycall.c
testmycall.c: In function ‘syscall’:
testmycall.c:7: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
testmycall.c:11: error: expected ‘{’ 

это приложение, есть идеи почему ???

Ответы [ 2 ]

2 голосов
/ 24 октября 2010

Я считаю, что макросы _syscallN() были удалены из заголовков ядра около 2.6.18 или около того.

(не особенно полезные) сообщения об ошибках от gcc связаны с тем, что _syscall1 не определен вообще - вы получите те же ошибки, если напишите:

any_old_rubbish_here(long, mycall, int, i)

Функция syscall() должна работать. man syscall для деталей.

1 голос
/ 24 октября 2010

Макросы _syscall устарели и не должны использоваться, вместо этого используйте syscall, например.

#define _GNU_SOURCE
#include <unistd.h>
...

printf("%d\n", syscall(__NR_mycall, 15));

Вот моя тестовая программа:

#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>

#define __NR_mycall 244

int main(int argc, char **argv)
{
    printf("%d\n", syscall(__NR_mycall,15));
    return 0;
}
...