libc なんていらないもん!
libc 無しでとりあえず動くプログラムを、LinuxやMac OSで作ってみた。
_exit()のため、アセンブリ言語のコードがあります。
なかなかおもしろいけど、これをやるくらいなら全部アセンブリ言語で書いた方がいいな〜
Linux 32bit
int main(int argc, char *argv[]) { return(0); } void _start(int args) { main(0, 0); asm("movl $0,%ebx\n" "movl $1,%eax\n" "int $0x80"); }
$ gcc -S nop_nocrt_linux.c
$ gcc -c nop_nocrt_linux.s
$ ld -nostdlib nop_nocrt_linux.o
$ ./a.out
Mac OS X 64bit
int main(int argc, char *argv[]) { return(0); } void _start(int argc) { main(0, 0); asm("mov $0x2000001,%rax\n" "mov $0,%rdi\n" "syscall"); }
$ gcc -S nop_nocrt_lion.c
$ gcc -c nop_nocrt_lion.s
$ ld -e __start nop_nocrt_lion.o
ld: warning: -macosx_version_min not specificed, assuming 10.7
ld: warning: symbol dyld_stub_binder not found, normally in libSystem.dylib
$ ./a.out
Mac OS X 32bit
int main(int argc, char *argv[]) { return(0); } void _start(int argc) { main(0, 0); asm("pushl $0\n" "movl $1,%eax\n" "leal -0x4(%esp), %ecx\n" "sysenter"); }
$ gcc -S nop_nocrt_sl.c
$ gcc -c nop_nocrt_sl.s
$ ld -e __start nop_nocrt_sl.o
$ ./a.out