Wo bekomme ich eine aktuelle Liste der Syscalls her?
-
Guten Tag,
ich versuche mich zurzeit in Assembler für mein 64bit Linux-System. Gewissermaßen funktioniert es auch, aber nicht so wie es soll...
Zurzeit habe ich mich an folgender Liste orientiert: http://syscalls.kernelgrok.com/
Nach einigen Probieren habe ich folgenden Code erzeugt:.global _start .text _start: movq $4, %rax movq $1, %rdi movq $msg, %rsi movq $12, %rdx syscall movq $1, %rax xor %rdi, %rdi syscall .data msg: .ascii "Hello World\n"
Laut der syscall-Liste ist write() syscall 4, daher schiebe ich 4 in %rax. stdout ist 1, daher schiebe ich dann in rdi und dann den String und die Länge. Dann am Ende möchte ich exit() aufrufen und schiebe 1 nach %rax und rdi wird genullt. Allerdings gibt das Programm keine Ausgabe.
Nach einiger Scuhe habe ich folgendes Beispiel gefunden, welches funktioniert:
.global _start .text _start: # write(1, message, 13) mov $1, %rax # system call 1 is write mov $1, %rdi # file handle 1 is stdout mov $message, %rsi # address of string to output mov $13, %rdx # number of bytes syscall # invoke operating system to do the write # exit(0) mov $60, %rax # system call 60 is exit xor %rdi, %rdi # we want return code 0 syscall # invoke operating system to exit message: .ascii "Hello, world\n"
Warum funktioniert mein Code nicht? Warum verwendet das zweite Beispiel andere syscalls? Was habe ich übersehen?
Vielen liebe Dank,
Dudu
-
Die Syscall-Nr unterscheiden sich je nach Architektur.
Bei mir gibt es "/usr/include/asm/unistd_32.h":
#define __NR_exit 1 #define __NR_write 4
und "/usr/include/asm/unistd_64.h":
#define __NR_write 1 #define __NR_exit 60
kA ob es da eine elegante Möglichkeit in Asm gibt.
-
Vielen Dank! Vor einem Moment habe ich die Liste auch gefunden. ^^ (Warum muss man immer erst fragen, bevor man die relevanten Sachen findet?)
Gibt es da eigentlich auch eine Liste/Datei wo drin steht, welche Zahl für stdin, stdout und so stehen?
-
"/usr/include/unistd.h":
#define STDIN_FILENO 0 /* Standard input. */ #define STDOUT_FILENO 1 /* Standard output. */ #define STDERR_FILENO 2 /* Standard error output. */
-
Dudu52 schrieb:
Vielen Dank! Vor einem Moment habe ich die Liste auch gefunden. ^^ (Warum muss man immer erst fragen, bevor man die relevanten Sachen findet?)
Gibt es da eigentlich auch eine Liste/Datei wo drin steht, welche Zahl für stdin, stdout und so stehen?
Hier suchte evtl. man stdin.
~(Ich hasste Punkte als Abkürzungszeichen, die verwechselt man beim Lesen mit dem Satzzeichen.)
~
"On program startup, the integer file descriptors associated with the streams stdin, stdout, and stderr are 0, 1, and 2, respectively. The preprocessor symbols STDIN_FILENO, STDOUT_FILENO, and STDERR_FILENO are defined with these values in <unistd.h>. (Applying freopen(3) to one of these streams can change the file descriptor number associated with the stream.)"
-
volkard schrieb:
Dudu52 schrieb:
Vielen Dank! Vor einem Moment habe ich die Liste auch gefunden. ^^ (Warum muss man immer erst fragen, bevor man die relevanten Sachen findet?)
Gibt es da eigentlich auch eine Liste/Datei wo drin steht, welche Zahl für stdin, stdout und so stehen?
Hier suchte evtl. man stdin.
~(Ich hasste Punkte als Abkürzungszeichen, die verwechselt man beim Lesen mit dem Satzzeichen.)
~
"On program startup, the integer file descriptors associated with the streams stdin, stdout, and stderr are 0, 1, and 2, respectively. The preprocessor symbols STDIN_FILENO, STDOUT_FILENO, and STDERR_FILENO are defined with these values in <unistd.h>. (Applying freopen(3) to one of these streams can change the file descriptor number associated with the stream.)"Ouch... Ich habe in der man-page von read geschaut; direkt bei stdin zu schauen bin ich nicht auf die Idee gekommen...
Danke!
-
Syscall Nummern:
https://github.com/torvalds/linux/blob/master/arch/x86/syscalls/syscall_64.tblSyscall Signaturen:
https://github.com/torvalds/linux/blob/master/include/linux/syscalls.h
https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/syscalls.h