#define LINUX 1 #define OPENBSD 16 #define FREEBSD 32 #define NETBSD 64 #ifndef SUPPORT_VECTOR #define SUPPORT_VECTOR (LINUX | FREEBSD | NETBSD | OPENBSD) #endif #define SupportsLinux() (SUPPORT_VECTOR & LINUX) #define SupportsFreebsd() (SUPPORT_VECTOR & FREEBSD) #define SupportsOpenbsd() (SUPPORT_VECTOR & OPENBSD) #define SupportsNetbsd() (SUPPORT_VECTOR & NETBSD) #define IsLinux() (SupportsLinux() && os == LINUX) #define IsFreebsd() (SupportsFreebsd() && os == FREEBSD) #define IsOpenbsd() (SupportsOpenbsd() && os == OPENBSD) #define IsNetbsd() (SupportsNetbsd() && os == NETBSD) __attribute__((__noreturn__)) static void Exit(int rc, int os) { asm volatile("syscall" : /* no outputs */ : "a"(IsLinux() ? 60 : 1), "D"(rc) : "memory"); __builtin_unreachable(); } static int Write(int fd, const void *data, int size, int os) { char cf; int ax, dx; asm volatile("clc\n\t" "syscall" : "=a"(ax), "=d"(dx), "=@ccc"(cf) : "0"(IsLinux() ? 1 : 4), "D"(fd), "S"(data), "1"(size) : "rcx", "r11", "memory", "cc"); if (cf) ax = -ax; return ax; } static int Main(int argc, char **argv, char **envp, long *auxv, int os) { Write(1, "hello world\n", 12, os); return 0; } __attribute__((__noreturn__)) void Start(long di, long *sp) { long *auxv; int i, os, argc; char **argv, **envp, *page; // detect freebsd if (SupportsFreebsd() && di) { os = FREEBSD; sp = (long *)di; } else { os = 0; } // extract arguments argc = *sp; argv = (char **)(sp + 1); envp = (char **)(sp + 1 + argc + 1); auxv = (long *)(sp + 1 + argc + 1); for (;;) { if (!*auxv++) { break; } } // detect openbsd if (SupportsOpenbsd() && !os && !auxv[0]) { os = OPENBSD; } // detect netbsd if (SupportsNetbsd() && !os) { for (; auxv[0]; auxv += 2) { if (auxv[0] == 2014 /* AT_EXECFN */) { os = NETBSD; break; } } } // default operating system if (!os) { os = LINUX; } Exit(Main(argc, argv, envp, auxv, os), os); }