手动创建并运行可执行文件

gon*_*one 5 c compiler-construction assembly

只是为了兴趣,我想手工编译并运行最简单的C程序;

//t.c

int main() {
       return 0;
}
Run Code Online (Sandbox Code Playgroud)

所以我想做:

  • $ cpp t.c:在这种情况下不应该执行任何操作,因为不需要进行预处理
  • $ cc1 t.c: 应该编译t.c->t.s
  • $ as -o t.o t.c: 应该组装t.s->t.o
  • $ ld t.o:应该生成可执行文件a.out(实际上没有什么可做的)

我遇到的问题是as,因为运行最终命令会产生:

ld: warning: cannot find entry symbol _start; defaulting to 00000000000400b0
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?我故意忽略了libc这一点,以使其尽可能简单,但我不明白发生了什么。我缺少什么标志?

Nik*_*sov 5

加载和执行程序还需要更多的工作。您可以从链接器输出中猜测到,执行不是从 开始main,而是从 开始_start,它由与编译器捆绑在一起的 CRT(C 运行时)库提供,并在幕后与您的代码链接。

这里这里是 Linux 上程序启动时发生的情况的一些概述。

在您的虚拟源上执行此操作cc -v -Wall以详细查看所有必需的步骤。