C 语言程序没有 main() 也能跑?

Writing a (valid) C program without main()

C 语言程序没有 main() 也能跑?

大多数编程语言都从 main() 函数开始执行,但 C 语言其实可以打破这个规则。本文带你深入 C 编译流程,从预处理器、编译器、汇编器到链接器,一步步拆解程序是如何被构建的。你会发现,main() 并非真正的入口,真正的起点是 _start。通过手动编写汇编代码并绕过 C 运行时库,我们成功构建了一个没有 main() 函数却能正常运行的 C 程序。这不仅揭示了 Linux 系统调用的底层机制,也让我们更理解操作系统如何启动一个程序。

当你学会 C 程序是如何被编译、链接和执行的,你实际上是在学习 Linux API 的真实运作方式。
  1. eska

    注意,根据标准,这并非一个“有效”的 C 程序。标准允许 freestanding 和 hosted 环境。freestanding 环境允许入口点名称不是 main,但还有其他要求。如果有兴趣,可以查看草案的第 4 节和第 5 节。

  2. asveikau

    我认为“有效”的定义可能有所不同。这是一个符合标准的 C 程序吗?不是。你是否利用了平台的实现细节来创建一个能正确加载并运行的程序?当然可以。

    不过,大多数有趣的 C 程序在某种程度上都违反了标准。

  3. pjmlp

    > C 是你能在不写汇编的情况下最接近操作系统的语言。

    不对,自 1958 年的 JOVIAL 以来,许多语言都提供了相同的功能。

    这是一个由那些从未学过其他系统编程语言或计算机历史的人传播的都市传说。

同日更多故事

2026-07-25