小编Upg*_*ade的帖子

Executable and Linkable Format(.elf) 和 Object(.o) 文件的区别

我在 linux ( man gcc)上查看 gcc 手册中的-c选项 ( gcc -c infile),其中指出:

-c:编译或汇编源文件,但不链接。链接阶段根本没有完成。最终的输出是以每个源文件的目标文件的形式。
默认情况下,源文件的目标文件名是通过将后缀 .c、.i、.s 等替换为 .o 来生成的。

更重要的是,在检查 ELF 文件和目标文件(使用filecomand )时,输出是相同的:

file ./out/main.o: ELF 32-bit LSB relocatable, Atmel AVR 8-bit, version 1 (SYSV), not stripped
file ./out/main.elf: ELF 32-bit LSB executable, Atmel AVR 8-bit, version 1 (SYSV), statically linked, not stripped
Run Code Online (Sandbox Code Playgroud)

所以他们都有相同的描述。我的问题是:

  • 两个文件之间的实际区别是什么,或者如果我有多个源文件?
  • 要运行的正确文件是什么,以及如何生成它?
  • 我需要目标文件,还是它们只是中间文件?
  • 如果我使用-c选项和一些标志(-Wall -g -std=c99 -Os)编译一些源文件并从中获取目标文件,这些标志是否会在 ELF 文件生成中持续存在(如果我在目标文件上使用它们,我可以在生成 ELF 文件时跳过这些标志)?

c elf object-files

3
推荐指数
2
解决办法
2842
查看次数

标签 统计

c ×1

elf ×1

object-files ×1