Passing parameters to system calls
15,888
Solution 1
Remove the type names. It's just a function call. Example:
#include <sys/syscall.h>
#include <unistd.h>
int main( int argc, char* argv[] ) {
char str[] = "boo\n";
syscall( __NR_write, STDOUT_FILENO, str, sizeof(str) - 1 );
return 0;
}
Solution 2
The prototype for syscall is
#define _GNU_SOURCE /* or _BSD_SOURCE or _SVID_SOURCE */
#include <unistd.h>
#include <sys/syscall.h> /* For SYS_xxx definitions */
int syscall(int number, ...);
This says that it takes a variable number (and type) of parameters. That depends on the particular system call. syscall is not the normal interface to a particular system call. Those can be explicitly coded, for example write(fd, buf, len).
Author by
Jeff
Updated on June 09, 2022Comments
-
Jeff 7 monthsI did a basic helloWorld system call example that had no parameters and was just:
int main() { syscall(__NR_helloWorld); return 0; }But now I am trying to figure out how to pass actual arguments to the system call (ie. a
long). What is the format exactly, I tried:int main() { long input = 1; long result = syscall(__NR_someSysCall, long input, long); return 0; }Where it takes a
longand returns along, but it is not compiling correctly; what is the correct syntax? -
Jeff over 11 years1 refers to the # of parameters, but what does 4 refer to? -
Nikolai Fetissov over 11 yearsNo,1is a parameter -stdoutfile descriptor number in this case,4is the length of the buffer, as inwrite( FILENO_STDOUT, boo, 4 );