a.out、.ELF、.EXE和.COFF之间的使用差异

24

看到问题标题不要误解我的意思 - 我知道它们是什么(可移植可执行文件格式)。但我的兴趣范围略有不同。

我的困惑

我涉及重新主机化/重新定位最初来自第三方的应用程序。问题在于,有时目标代码的格式也是 .elf、.COFF 格式,并且仍然称为“可执行和可链接”。

我主要是 Windows 用户,并且知道当您编译和汇编您的 C/C++ 代码时,您会得到类似于 .o 或 .obj 的东西。它们不可执行(嗯,我从未尝试过执行它们)。但是,当您完成静态和动态库的链接并完成构建时,可执行文件就会出现。我的理解是,然后您可以进一步链接该可执行文件或者如果必要可以使用某种脚本进行“bash”测试。

然而,在 Linux(或类 UNIX 系统)中,编译和汇编 C/C++ 代码后会生成 .o 文件。一旦链接完成,可执行文件以 a.out 格式呈现(至少在 Linux 的 Ubuntu 发行版中是这样)。在我的快速网络搜索中,没有任何来源提到将 .o 文件作为可执行文件。

问题

因此,我的问题转化为以下几个方面:

  1. 可移植可执行文件和目标代码的真正定义是什么?

  2. 为什么 Windows 和 UNIX 平台将可执行文件和目标代码都包含在相同的文件格式 (.COFF、.elf) 下?

  3. 我是否误解了“可链接”? 我对“可链接”的理解是编译的目标代码,然后可以将其“链接”到其他静态/动态链接库。这个想法很蠢吗?

  4. 基于问题 1(也许是问题 2),我是否需要使用符号表(例如 .LUM 或 .MAP 文件)来处理目标代码?符号指调试符号,并在将可执行文件/目标文件重新主机化到另一台计算机上时使用它们。

感谢您提供的正确引导。与此同时,我将继续搜索并在必要时更新问题。

更新

我从某个地方挖出了这个:( 看起来对我来说是很难理解的内容。

1个回答

22
我主要是Windows用户,知道当您编译C / C ++代码时,会得到类似于.o或.obj的东西,它们不可执行。上次在Windows上编译代码时,编译的结果实际上是一个.obj文件,正如其名称所示:它是一个object file。您是正确的,它本身不是可执行文件。它包含机器代码,该代码还没有足够的信息直接在CPU上运行。
然而,在Linux(或类UNIX系统)中,编译C / C ++代码后会有.o文件。一旦链接完成,可执行文件以a.out格式存在(至少在Ubuntu Linux发行版中)。在其他发行版中,它也可能是.elf。
Living in the 90's, that is :P 我所知道的现代编译器都不会将a.out格式作为目标代码的默认输出格式。也许GCC默认将目标代码放入名为a.out的文件中是有误导性的,但如果你在a.out上运行file命令,你会发现它是一个ELF文件。 a.out格式是古老的,已经有点"事实上过时"了。
“便携式可执行文件”和“目标代码”的真正定义是什么?
你已经有了关于目标文件的维基百科链接,这里是“便携式可执行文件”的链接
Windows和UNIX平台如何将可执行文件和目标代码都包含在相同的文件格式(.COFF、.elf)中?
因为ELF格式(似乎COFF也是这样设计的)。为什么不呢?毕竟它只是相同的机器代码,使用一种文件格式在所有编译步骤中似乎非常合理。就像我们不喜欢动态库和独立可执行文件有不同的格式一样。(这就是为什么ELF被称为ELF——它是“可执行可链接格式”)。
“可链接”这个词被我理解错了吗?
我不知道。从你的问题中,我无法确定你认为“可链接”是什么意思。通常,它表示可以链接的文件,即库。
基于问题1(也许问题2),我需要使用符号表(例如.LUM或.MAP文件)与目标代码一起使用吗?符号作为调试符号,并在将目标文件重新托管到不同机器上时使用它们。
我认为这与使用可执行格式无关。如果您想进行调试,则无论如何都必须生成调试信息。但是,如果您不需要进行调试,则当然可以省略它们。

我正在更新我的问题(可链接的部分)。现在应该更好了! - ha9u63a7
1
@hagubear 抱歉,我完全不理解你的第四个问题。你所说的“使用符号表与目标代码”是什么意思?在什么意义上使用?“与目标代码一起”又是什么意思? - user529758
此外,在你发帖提到“目标代码位”之前,我已经在维基百科上进行了搜索。由于不同人对同一主题的看法不同,维基百科有时会出现错误的情况。我尊重stackoverflow比任何书籍或网站更多,因为像你这样的专家用户可以对问题范围进行建设性的批评并分享你们的知识/理解。因此,我在这里提问而不是去维基百科上查找 :) - ha9u63a7
1
@hagubear 我认为我现在明白了,请查看编辑。嗯,是的,在某些情况下,Stack Overflow 可以比维基百科更值得信赖。而且,我远非专家 :) - user529758
感谢H2CO3的建议。请注意,我将“编译”更改为“编译和汇编”,因为这对于目标文件而言更有意义,而不是汇编器代码。 - ha9u63a7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接