如果使用 -nostdlib编译代码,就不能调用任何 C 库函数(当然) ,但是也不能获得常规的 C 引导程序代码。特别是,Linux 上程序的真正入口点不是 main(),而是一个称为 _start()的函数。标准库通常提供一个这样的版本,运行一些初始化代码,然后调用 main()。
尝试用 gcc -nostdlib -m32编译这个代码:
// Tell the compiler incoming stack alignment is not RSP%16==8 or ESP%16==12
__attribute__((force_align_arg_pointer))
void _start() {
/* main body of program: call main(), etc */
/* exit system call */
asm("movl $1,%eax;"
"xorl %ebx,%ebx;"
"int $0x80"
);
__builtin_unreachable(); // tell the compiler to make sure side effects are done before the asm statement
}