此问题已在此处有答案:
What's an object file in C?(5个答案)9年前关闭。有人问我一个问题:“什么是”目标文件“?“.看了Wiki后,我只知道它包含对象。但这些物体是什么,为什么有人这样称呼它们?
mspsb9vt1#
目标文件(或目标代码)是由编译器从源代码生成的机器代码文件。与可执行文件的区别在于,目标文件没有链接,因此对函数、符号等的引用还没有定义(它们的内存地址基本上是空白的)。当你用GCC编译一个C文件时:
gcc -Wall -o test test.c
这里你正在编译AND链接。因此,您将得到一个可执行文件,其中包含它所包含的符号(库,头等)的所有内存地址引用。但是当你这样做的时候:
gcc -Wall -o test.o -c test.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)
术语对象在这里代表未链接的机器代码序列(基本上)。对象文件包含对象。你问:为什么这个电话是这样的。我不能回答。“蓝色”为什么叫“蓝色”?(请输入)这只是一个术语,因为...几十年作为参考,GCC Internals文档仅将目标代码定义为:作品的“源代码”是指对作品进行修改的首选形式。“目标代码”是指任何非源代码形式的作品。关于历史原因很模糊...我只是希望你现在能更好地理解什么是目标文件。我认为这比知道它为什么叫这个名字更重要,因为单词只是,嗯,单词...
wfypjpf42#
我认为这个名字与区分以下两种情况有关:
目标文件包含:
来源:here
b1uwtaje3#
目标文件是源(文本)文件的二进制表示.它是一个不同部分的集合,将数据类型分隔为:
根据您的编译器/环境,这些可能会有所不同。例如,在 *nix系统上:objdump -d a.out <--- provide we compiled a. cpp
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:
这里的各种调用命令然后被喜欢到各种库来调用实际的函数。
xzv2uavs4#
根据您链接的页面,每个序列或对象通常包含用于主机完成某些任务的指令,可能伴随着相关数据和元数据(例如,重定位信息、堆栈展开信息、注解、程序符号、调试或剖析信息)。基本上,对象文件中的每个对象都是一个函数,以及链接器将其包含到完整程序中的相关信息。
4条答案
按热度按时间mspsb9vt1#
目标文件(或目标代码)是由编译器从源代码生成的机器代码文件。
与可执行文件的区别在于,目标文件没有链接,因此对函数、符号等的引用还没有定义(它们的内存地址基本上是空白的)。
当你用GCC编译一个C文件时:
这里你正在编译AND链接。因此,您将得到一个可执行文件,其中包含它所包含的符号(库,头等)的所有内存地址引用。
但是当你这样做的时候:
你将产生一个目标文件。它也是机器代码,但它需要被链接以产生可执行文件或库。
当你有一个包含许多C文件的项目时(例如),你将把每一个都编译成目标代码,然后你将把所有的目标文件链接在一起,以产生最终的产品。
例如:
术语对象在这里代表未链接的机器代码序列(基本上)。对象文件包含对象。
你问:为什么这个电话是这样的。我不能回答。“蓝色”为什么叫“蓝色”?(请输入)
这只是一个术语,因为...几十年
作为参考,GCC Internals文档仅将目标代码定义为:
作品的“源代码”是指对作品进行修改的首选形式。“目标代码”是指任何非源代码形式的作品。
关于历史原因很模糊...
我只是希望你现在能更好地理解什么是目标文件。我认为这比知道它为什么叫这个名字更重要,因为单词只是,嗯,单词...
wfypjpf42#
我认为这个名字与区分以下两种情况有关:
目标文件包含:
来源:here
b1uwtaje3#
目标文件是源(文本)文件的二进制表示.它是一个不同部分的集合,将数据类型分隔为:
根据您的编译器/环境,这些可能会有所不同。
例如,在 *nix系统上:
objdump -d a.out <--- provide we compiled a. cpp
这里的各种调用命令然后被喜欢到各种库来调用实际的函数。
xzv2uavs4#
根据您链接的页面,每个序列或对象通常包含用于主机完成某些任务的指令,可能伴随着相关数据和元数据(例如,重定位信息、堆栈展开信息、注解、程序符号、调试或剖析信息)。
基本上,对象文件中的每个对象都是一个函数,以及链接器将其包含到完整程序中的相关信息。