请不要看问题标题误会我的意思 - 我知道它们是什么(可移植可执行文件的格式)。但我的兴趣范围略有不同
我的困惑
我参与了最初来自第三方的重新托管/重定向应用程序。问题是,有时目标代码的格式也是 .elf、.COFF 格式,但仍然显示“可执行且可链接”。
我主要是一名 Windows 用户,并且知道当您编译和汇编 C/C++ 代码时,您会得到类似于 .o 或 .obj 的内容。不可执行(好吧,我从未尝试过执行它们)。但是,当您完成静态和动态库的链接并完成构建时,就会出现可执行文件。我的理解是,如果有必要,您可以继续链接该可执行文件或“bash”,使用某种形式的脚本对其进行测试。
但是,在 Linux(或类 UNIX 系统)中,编译和汇编 C/C++ 代码后会生成 .o 文件。一旦链接完成,可执行文件就是 a.out 格式(至少在 Linux 的 Ubuntu 发行版中是这样)。它很可能是其他发行版中的 .elf。在我的快速网络搜索中,没有任何来源提到有关 .o 文件作为可执行文件的任何内容。
问题
因此我的问题变成了以下内容:
是什么true可移植可执行文件和目标代码的定义?
Windows 和 UNIX 平台如何在同一文件格式(.COFF、.elf)下涵盖可执行代码和目标代码?
我是否误解了“可链接”?我对“可链接”的解释是编译后的目标代码,然后可以“链接”到其他静态/动态链接库。这是一个愚蠢的想法吗?
基于问题 1(也许还有问题 2),我是否需要将符号表(例如 .LUM 或 .MAP 文件)与目标代码一起使用?调试符号中的符号以及在不同计算机上重新托管可执行文件/对象文件时使用它们。
预先感谢您的正确推动。同时,如果有必要,我将继续挖掘并更新问题。
UPDATE
我已经成功挖掘this http://www.tenouk.com/ModuleW.html从某个地方出来:(对我来说似乎有很多需要吞下的东西。
我主要是一名 Windows 用户,并且知道当您编译 C/C++ 代码时,您会得到类似于 .o 或 .obj 的内容。不可执行的
嗯,上次我在Windows上编译的东西,编译的结果was an .obj
文件,正如其名称所示:它是一个目标文件 https://en.wikipedia.org/wiki/Object_file。你是对的,它本身不是可执行文件。它包含的机器代码(尚未)包含足够的信息来直接在 CPU 上运行。
但是,在 Linux(或类 UNIX 系统)中,编译 C/C++ 代码后会生成 .o 文件。一旦链接完成,可执行文件就是 a.out 格式(至少在 Linux 的 Ubuntu 发行版中是这样)。它很可能是其他发行版中的 .elf。
生活在 90 年代,那就是 :P 我知道没有现代编译器以a.out
format 作为目标代码的默认输出格式。也许将目标代码放入名为的文件中是 GCC 的一个误导性默认设置a.out
当未指定显式输出文件名时,但如果运行file
命令开启a.out
,你会发现这是一个ELF文件。这a.out
格式很古老,而且有点“事实上已经过时”。
可移植可执行文件和目标代码的真正定义是什么?
您已经获得了目标文件的维基百科链接,这是“可移植可执行文件”的一个 http://en.wikipedia.org/wiki/Portable_Executable.
Windows 和 UNIX 平台如何在同一文件格式(.COFF、.elf)下涵盖可执行代码和目标代码?
因为 ELF 格式(显然 COFF 也是如此)就是这样设计的。那么为何不?毕竟,这只是完全相同的机器代码,在所有编译步骤中使用一种文件格式似乎很合乎逻辑。就像我们不喜欢动态库和独立可执行文件具有不同的格式一样。 (这就是为什么 ELF 被称为 ELF - 它是一个“可执行文件and可链接格式”。)
我是否误解了“可链接”?
我不知道。从你的问题来看,我不清楚你认为“可链接”是什么。一般来说,这意味着它是一个可以链接的文件,即。 e.图书馆。
基于问题 1(也许还有问题 2),我是否需要将符号表(例如 .LUM 或 .MAP 文件)与目标代码一起使用?调试符号中的符号以及在不同计算机上重新托管目标文件时使用它们。
我认为这与所使用的可执行格式无关。如果你想调试,无论如何你都必须生成调试信息。但如果您不需要调试,那么您当然可以忽略它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)