libc なんていらないもん!

libc 無しでとりあえず動くプログラムを、LinuxMac 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