msc*_*msc 3 c gcc program-entry-point startup segmentation-fault
以下程序从Quora复制,即打印功能"Hello world"之前main().
#include <stdio.h>
#include <unistd.h>
int main(void)
{
return 0;
}
void _start(void)
{
printf ("hello, world\n");
int ret = main();
_exit (ret);
}
Run Code Online (Sandbox Code Playgroud)
然后,我使用以下命令在Ubuntu-14.04 GCC编译器上编译了上述程序
gcc -nostartfiles hello.c
Run Code Online (Sandbox Code Playgroud)
并运行a.out可执行文件,但我得到了Segmentation fault (core dumped)?那么,为什么分段错误呢?
_start是可执行文件的真正入口点,通常由C运行时用来初始化它的东西 - 包括stdio - ,用constructor属性标记的调用函数然后调用你的main入口点.如果你拿它并尝试使用标准库中的东西(例如printf),你就会生活危险,因为你正在使用尚未初始化的东西.
但是,您可以做的是完全绕过C运行时,并使用直接系统调用进行打印,例如write.