【发布时间】:2019-04-12 02:38:49
【问题描述】:
我正在查看关于 linux (man gcc) 的 gcc 手册中的 -c 选项 (gcc -c infile),其中指出:
-c:编译或汇编源文件,但不链接。链接阶段根本没有完成。最终输出是每个源文件的目标文件的形式。
默认情况下,源文件的目标文件名是通过将后缀 .c、.i、.s 等替换为 .o。
更重要的是,在检查 ELF 文件和目标文件(使用 file 命令)时,输出是相同的:
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
所以它们都有相同的描述。 我的问题是:
- 这两个文件之间的实际区别是什么,或者如果我有多个源文件?
- 要运行的正确文件是什么,如何生成它?
- 我需要目标文件,还是它们只是中间文件?
- 如果我使用
-c选项和一些标志(-Wall -g -std=c99 -Os)编译一些源文件并从中获取目标文件,这些标志是否会在 ELF 文件生成时持续存在(如果我在生成 ELF 文件时可以跳过这些标志吗?在对象文件上使用它们)?
【问题讨论】:
-
不一样的描述:一个是relocatable,另一个是executable。
-
哪个是可重定位的,哪个是可执行的
-
它在
file输出中:ELF 32-bit LSB relocatable用于.o文件。 -
哦,谢谢你的提示,我是盲人:)
标签: c elf object-files