开发者

why am i getting these syntax errors when trying to implement system call

开发者 https://www.devze.com 2023-01-21 23:00 出处:网络
still working on this system call!!! i have added a system call to a kernel, compiled and the OS is running off it.

still working on this system call!!!

i have added a system call to a kernel, compiled and the OS is running off it.

now i am getting syntax error on the compilation of my test application.

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));

}

here is the error

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 specif开发者_开发百科iers 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

i have added in the syscall instead of _syscall1

now i get this error

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 ‘{’ 

this is the app, any ideas why???


I believe the _syscallN() macros were removed from the kernel headers around 2.6.18 or so.

The (not especially helpful) error messages from gcc are due to _syscall1 not being defined at all - you get the same errors if you write:

any_old_rubbish_here(long, mycall, int, i)

The syscall() function should work. man syscall for details.


The _syscall macros are obsolete and should not be used, instead use syscall, eg.

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

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

Here's my test program:

#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;
}
0

精彩评论

暂无评论...
验证码 换一张
取 消