source of highlighter
plain | download
    1 /*
    2  * 2015 by Marek Behun <kabel@blackhole.sk>
    3  * Only for Linux x86_64
    4  * gcc -nostdlib -nostdinc -o sys sys.c
    5  */
    6 
    7 /* nadefinujeme si typy size_t a ssize_t */
    8 typedef unsigned long int size_t;
    9 typedef long int ssize_t;
   10 
   11 /* toto bude funkcia na pristup do kernelu */
   12 long (*syscall) (long int, ...);
   13 
   14 void init_syscall (void)
   15 {
   16     /* a tu je jej kod, skompilovany assembler pre x86_64 pre Linux */
   17     static const char syscall_code[] = {
   18         0x48, 0x89, 0xf8,               // mov %rdi, %rax
   19         0x48, 0x89, 0xf7,               // mov %rsi, %rdi
   20         0x48, 0x89, 0xd6,               // mov %rdx, %rsi
   21         0x48, 0x89, 0xca,               // mov %rcx, %rdx
   22         0x4d, 0x89, 0xc2,               // mov %r8, %r10
   23         0x4d, 0x89, 0xc8,               // mov %r9, %r8
   24         0x4c, 0x8b, 0x4c, 0x24, 0x08,   // mov 0x8(%rsp), %r9
   25         0x0f, 0x05,                     // syscall
   26         0xc3,                           // retq
   27     };
   28 
   29     /* nastavime, aby pointer syscall ukazoval na zaciatok kodu */
   30     syscall = (void *) &syscall_code[0];
   31 }
   32 
   33 ssize_t sys_read (int fd, void * buf, size_t count)
   34 {
   35     return syscall (0, fd, buf, count);
   36 }
   37 
   38 ssize_t sys_write (int fd, void * buf, size_t count)
   39 {
   40     return syscall (1, fd, buf, count);
   41 }
   42 
   43 void sys_exit (int status)
   44 {
   45     syscall (60, status);
   46 }
   47 
   48 void _start (int argc, char ** argv, char ** envp)
   49 {
   50     init_syscall ();
   51 
   52     sys_write (1, "abc\n", 4);
   53 
   54     sys_exit (0);
   55 }