看到问题标题不要误解我的意思 - 我知道它们是什么(可移植可执行文件格式)。但我的兴趣范围略有不同。
我的困惑
我涉及重新主机化/重新定位最初来自第三方的应用程序。问题在于,有时目标代码的格式也是 .elf、.COFF 格式,并且仍然称为“可执行和可链接”。
我主要是 Windows 用户,并且知道当您编译和汇编您的 C/C++ 代码时,您会得到类似于 .o 或 .obj 的东西。它们不可执行(嗯,我从未尝试过执行它们)。但是,当您完成静态和动态库的链接并完成构建时,可执行文件就会出现。我的理解是,然后您可以进一步链接该可执行文件或者如果必要可以使用某种脚本进行“bash”测试。
然而,在 Linux(或类 UNIX 系统)中,编译和汇编 C/C++ 代码后会生成 .o 文件。一旦链接完成,可执行文件以 a.out 格式呈现(至少在 Linux 的 Ubuntu 发行版中是这样)。在我的快速网络搜索中,没有任何来源提到将 .o 文件作为可执行文件。
问题
因此,我的问题转化为以下几个方面:
可移植可执行文件和目标代码的真正定义是什么?
为什么 Windows 和 UNIX 平台将可执行文件和目标代码都包含在相同的文件格式 (.COFF、.elf) 下?
我是否误解了“可链接”? 我对“可链接”的理解是编译的目标代码,然后可以将其“链接”到其他静态/动态链接库。这个想法很蠢吗?
基于问题 1(也许是问题 2),我是否需要使用符号表(例如 .LUM 或 .MAP 文件)来处理目标代码?符号指调试符号,并在将可执行文件/目标文件重新主机化到另一台计算机上时使用它们。
感谢您提供的正确引导。与此同时,我将继续搜索并在必要时更新问题。
更新
我从某个地方挖出了这个:( 看起来对我来说是很难理解的内容。