在 C 语言中 main() 函数之前打印"Hello world"



以下程序从Quora复制,在main()函数之前打印"Hello world"

#include <stdio.h>
#include <unistd.h>
int main(void)
{
  return 0;
}
void _start(void)
{
  printf ("hello, worldn");
  int ret = main();
  _exit (ret);
}

然后,我使用以下命令在 Ubuntu-14.04 GCC 编译器上编译了上面的程序

gcc -nostartfiles hello.c

并运行了a.out可执行文件,但我得到了Segmentation fault (core dumped)?那么,为什么会有分段错误呢?

_start

可执行文件的真正入口点,通常由 C 运行时用来初始化它的东西 - 包括 stdio - 调用标有 constructor 属性的函数,然后调用你的main入口点。如果你接受它并尝试使用标准库中的东西(例如printf),那么你的生活很危险,因为你正在使用尚未初始化的东西。

但是,您可以做的是完全绕过 C 运行时,并使用直接系统调用(例如 write )进行打印。

相关内容

  • 没有找到相关文章