【发布时间】:2016-06-13 11:00:42
【问题描述】:
据我了解,GCC 编译器在我编译 C 程序时执行四个步骤。
- 预处理 - 带宏的 C 代码 (*.c) 到不带宏的 C 代码 (*.c)
- 编译 - C 代码 (*.c) 到汇编语言 (*.s)
- 汇编 - 汇编语言 (*.s) 到目标代码 (*.o)
- 链接 - 对象代码 (*.o) 到可执行文件 (*)
前三个步骤对我来说非常有意义,但我仍然对链接的实际作用感到困惑。
在第三步之后为什么我不能运行 *.o 文件?那时我的 C 代码现在是对象/机器/字节代码,可以由 CPU 直接解释。然而,当我使我的 *.o 文件可执行并尝试运行它时,我得到了这个错误:
bash: ./helloworld.o: cannot execute binary file: Exec format error
为什么会出现此错误?如果我有一个只有一个 C 文件的小型 C 程序(例如一个 hello world 程序),在我看来,链接没有任何意义,因为没有什么可链接的。那么编译过程中的链接到底是做什么的呢?
提前感谢您的任何回复。
【问题讨论】:
-
你在helloworld程序中使用的
printf()怎么样?这是哪里来的? -
@SouravGhosh 非常正确,我没有想到这一点。因此,链接不仅将我的目标文件链接在一起,还链接其他目标文件(例如标准库)。谢谢。
标签: c gcc compilation linker