【发布时间】:2013-05-26 02:25:48
【问题描述】:
为了兴趣,我想手工编译运行最简单的C程序;
//t.c
int main() {
return 0;
}
所以我想做:
-
$ 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
发生了什么事?我故意省略了libc 以保持尽可能简单,但我不明白发生了什么。我错过了哪些标志?
【问题讨论】:
-
哦,我需要链接
crt1.o吗? -
是的,crt1.o 将提供_start
-
而且你真的应该在预处理之后有一个中间文件,因为它是预处理器会在顶部删除你的评论(尽管传递它可能不会损害下一次传递)。
-
@LeeDanielCrocker 实际上,编译器接受仍然包含 cmets 的“预处理”文件。如果出于某种原因需要,GCC 的预处理器甚至可以选择保留它们。
标签: c assembly compiler-construction