Hasty Briefsbeta

双语

Writing a (valid) C program without main()

3 hours ago
  • 大多数编程语言从 main() 函数开始执行,但本教程选择 C 语言是因为它最接近操作系统,无需使用汇编。
  • C 编译流程包含四个阶段:预处理 (cpp)、编译 (cc1)、汇编 (as) 和链接 (ld/collect2)。
  • 预处理器处理 #include 和 #define 等指令,展开宏并生成更大的 .i 文件。
  • 编译器生成汇编代码 (.s 文件),可通过 -O0、-O2 或 -Os 等优化标志改变循环和操作的结构。
  • 汇编器将汇编代码转换为目标文件 (.o),而链接器解析符号并添加启动代码 (crt 文件) 以生成最终可执行文件。
  • 真正的入口点是 _start 而非 main();通过提供自定义 _start 并使用 -nostartfiles 跳过启动文件,可以创建无需 main() 且直接使用内核系统调用的程序。
  • 没有 glibc 初始化时,printf 等函数会静默失败;低级操作需要原始系统调用(如 sys_write 和 sys_exit)。