【问题标题】:Print "Hello world" before main() function in C在 C 中的 main() 函数之前打印“Hello world”
【发布时间】:2026-02-17 04:55:02
【问题描述】:

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

#include <stdio.h>
#include <unistd.h>

int main(void)
{
  return 0;
}

void _start(void)
{
  printf ("hello, world\n");
  int ret = main();
  _exit (ret);
}

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

gcc -nostartfiles hello.c

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

【问题讨论】:

  • Why I got Segmentation fault? 你试过使用调试器吗?答案可能依赖于 libc 实现的深度,但 glibc 是开源的,你不应该对它进行调试。显然,您需要安装libc6-dbg(或libc-dbg)才能获取调试信息。
  • 你在Linux系统上使用gcc吗?
  • 是的,我在 Ubuntu 上使用 GCC。
  • 在 C 中,执行从 main 开始。使您的程序在main 之前执行的操作超出了C 的范围。

标签: c gcc segmentation-fault main startup


【解决方案1】:

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

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

【讨论】: