不要通过查看问题标题来误解我的意思 - 我知道它们是什么(可移植可执行文件的格式)。但我的兴趣范围略有不同
我的困惑
我参与重新托管/重新定位最初来自第三方的应用程序。问题是有时目标代码的格式也是 .elf、.COFF 格式,并且仍然显示“可执行和可链接”。
我主要是 Windows 用户,并且知道当您编译和组装 C/C++ 代码时,您会得到类似于 .o 或 .obj 的内容。是不可执行的(好吧,我从来没有尝试过执行它们)。但是当您完成链接静态库和动态库并完成构建时,会出现可执行文件。我的理解是,如果需要,您可以使用某种形式的脚本链接该可执行文件或“bash”对其进行测试。
但是,在 Linux(或类 UNIX 系统)中,在编译和汇编 C/C++ 代码后会有 .o 文件。一旦链接完成,可执行文件就是 a.out 格式(至少在 Linux 的 Ubuntu 发行版中)。它很可能是其他发行版中的 .elf。在我的快速网络搜索中,没有任何来源提到任何关于 .o 文件作为可执行文件的内容。
问题
因此我的问题变成了以下几点:
可移植可执行文件和目标代码的真正定义是什么?
Windows 和 UNIX 平台如何涵盖相同文件格式(.COFF、.elf)下的可执行文件和目标代码。
我是否误解了“可链接”?我对“可链接”的解释是编译后的目标代码,然后可以“链接”到其他静态/动态链接库。这是一个愚蠢的想法吗?
基于问题 1.(也许是 2)我是否需要将符号表(例如 .LUM 或 .MAP 文件)与目标代码一起使用?调试符号中的符号,并在不同机器上重新托管可执行文件/目标文件时使用它们。
在此先感谢您的正确推动。同时,如有必要,我将继续挖掘和更新问题。
更新
我已经设法从某个地方挖出来了:(对我来说似乎有很多东西要吞下去。