C++ “什么是”呢;“对象”;在;“对象文件”;为什么叫这个名字?

C++ “什么是”呢;“对象”;在;“对象文件”;为什么叫这个名字?,c++,c,compilation,linker,object-files,C++,C,Compilation,Linker,Object Files,我被问到一个问题:“什么是‘对象文件’?” 看了之后,我只知道它包含对象 但是,这些对象是什么?为什么有人这样称呼它们?根据您链接的页面,每个序列或对象通常包含主机完成某些任务的指令,可能伴随着相关数据和元数据(例如,重新定位信息、堆栈展开信息、注释、程序符号、调试或分析信息) 基本上,对象文件中的每个对象都是一个函数,以及链接器将其包含到完整程序中的相关信息。我认为名称与区分以下内容有关: 人类代码——源代码 机器代码目标代码 对象文件包含: 标题信息:有关文件的总体信息,例如代码的大小

我被问到一个问题:“什么是‘对象文件’?”

看了之后,我只知道它包含对象


但是,这些对象是什么?为什么有人这样称呼它们?

根据您链接的页面,每个序列或对象通常包含主机完成某些任务的指令,可能伴随着相关数据和元数据(例如,重新定位信息、堆栈展开信息、注释、程序符号、调试或分析信息)


基本上,对象文件中的每个对象都是一个函数,以及链接器将其包含到完整程序中的相关信息。

我认为名称与区分以下内容有关:

  • 人类代码——源代码
  • 机器代码目标代码
对象文件包含:

  • 标题信息:有关文件的总体信息,例如代码的大小、翻译源文件的名称,以及 创建日期
  • 目标代码:由编译器或汇编程序生成的二进制指令和数据
  • 重定位:当链接器更改目标代码的地址时,目标代码中必须修复的位置的列表
  • 符号:此模块中定义的全局符号、从其他模块导入的符号或由链接器定义的符号
  • 调试信息:关于目标代码的其他信息,不需要链接,但可用于调试器。这包括源文件 和行号信息、本地符号、数据描述 对象代码使用的结构,如C结构定义
源:

目标文件(或目标代码)是编译器根据源代码生成的机器代码文件

与可执行文件的区别在于,对象文件没有链接,因此对函数、符号等的引用还没有定义(它们的内存地址基本上为空)

使用GCC编译C文件时:

gcc -Wall -o test test.c
这里您正在编译链接。因此您将得到一个可执行文件,其中包含它所包含的符号(库、头等)的所有内存地址引用

但当你这样做的时候:

gcc -Wall -o test.o -c test.c
您将生成和对象文件。它也是机器代码,但需要链接才能生成可执行文件或库

例如,当您有一个包含多个C文件的项目时,您将把每个C文件编译成目标代码,然后将所有目标文件链接在一起以生成最终产品

例如:

gcc -Wall -o foo.o -c foo.c              // Object file for foo.c
gcc -Wall -o bar.o -c bar.c              // Object file for bar.c
gcc -Wall -o main.o -c main.c            // Object file for main.c
gcc -Wall -o software foo.o bar.o main.o // Executable (foo + bar + main)
术语object在这里表示未链接的机器代码序列(基本上)。 对象文件包含对象

你问:为什么这个电话是这样的。我真的不能回答。为什么“蓝色”被命名为“蓝色”?;)

这只是因为。。。好吧,几十年

作为参考,GCC内部文档仅将目标代码定义为:

作品的“源代码”是指修改作品的首选形式。“目标代码”指作品的任何非源代码形式

关于历史原因很模糊


我只是希望您现在能更好地理解什么是对象文件。我认为这比知道为什么这样叫更重要,因为单词就是单词…

对象文件是源(文本)文件的二进制表示形式。它是一个不同部分的集合,将数据类型划分为:

  • 文本部分
  • 数据段
  • 堆叠
根据编译器/环境的不同,这些选项可能会有所不同

例如,on*nix系统:


你应该去掉最后一个假设,剩下的是100%fine@SethCarnegie:“但这些目标是什么…?”我还是澄清了最后一句话。正如你所知,我不是反对者之一(我不会在没有留下无疑问评论的情况下反对)。“它”也让我困惑;我认为应该是“它们是”。但你忘了提到它们与可执行文件之间最重要的区别。每个可执行文件都是一个目标文件,但每个目标文件都不是一个可执行文件。这当然是一个非常古老的术语,因为Unix编译器至少从20世纪70年代初就已经生成了
.o
文件,它与OO编程没有任何关系。“对象:特定动作或感觉指向的人或事物。”生成该文件是运行编译器的目标,他们必须为其命名,因此……你应该真正尝试回答“为什么这样称呼它?”为了让你的整个帖子都很出色:D。
disassembly of section .init:

08048278 <_init>:
 8048278:       55                      push   %ebp
 8048279:       89 e5                   mov    %esp,%ebp
 804827b:       83 ec 08                sub    $0x8,%esp
 804827e:       e8 61 00 00 00          call   80482e4 <call_gmon_start>
 8048283:       e8 b3 00 00 00          call   804833b <frame_dummy>
 8048288:       e8 9f 01 00 00          call   804842c <__do_global_ctors_aux>
 804828d:       c9                      leave
 804828e:       c3                      ret
Disassembly of section .plt:

08048290 <puts@plt-0x10>:
 8048290:       ff 35 78 95 04 08       pushl  0x8049578
 8048296:       ff 25 7c 95 04 08       jmp    *0x804957c
 804829c:       00 00                   add    %al,(%eax)
        ...

080482a0 <puts@plt>:
 80482a0:       ff 25 80 95 04 08       jmp    *0x8049580
 80482a6:       68 00 00 00 00          push   $0x0
 80482ab:       e9 e0 ff ff ff          jmp    8048290 <_init+0x18>

080482b0 <__libc_start_main@plt>:
 80482b0:       ff 25 84 95 04 08       jmp    *0x8049584
 80482b6:       68 08 00 00 00          push   $0x8
 80482bb:       e9 d0 ff ff ff          jmp    8048290 <_init+0x18>
Disassembly of section .text: