gpt4 book ai didi

c - 编译过程中的链接实际上做了什么?

转载 作者:太空狗 更新时间:2023-10-29 16:10:54 29 4
gpt4 key购买 nike

据我了解,当我编译 C 程序时,GCC 编译器执行四个步骤。

  1. 预处理 - 带宏的 C 代码 (*.c) 到不带宏的 C 代码 (*.c)
  2. 编译 - C 代码 (*.c) 到汇编语言 (*.s)
  3. 汇编 - 汇编语言 (*.s) 到目标代码 (*.o)
  4. 链接 - 目标代码 (*.o) 到可执行文件 (*)

前三个步骤对我来说非常有意义,但我仍然对链接的实际作用感到困惑。

在第三步之后,为什么我不能运行 *.o 文件?那时我的 C 代码现在是对象/机器/字节代码,可以直接由 CPU 解释。然而,当我使我的 *.o 文件可执行并尝试运行它时,我得到了这个错误:

bash: ./helloworld.o: 无法执行二进制文件:Exec 格式错误

为什么会出现此错误?如果我有一个只有一个 C 文件的小型 C 程序(例如,hello world 程序),那么在我看来,链接没有任何意义,因为没有什么可链接的。那么编译过程中的链接到底做了什么?

提前感谢您的任何回复。

最佳答案

If I have a tiny C program (for example a hello world program)

甚至你的 helloworld 程序也使用 #inlude<stdio.h> ,不是吗?这意味着您正在使用一个库,链接步骤是组合必要的目标代码(这里是库代码)为您创建一个二进制文件。


有关链接步骤的详细描述(并与编译进行比较)- 请参阅 question

关于c - 编译过程中的链接实际上做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37788059/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com