Linker 两者之间的用法差异。a、 out、.ELF、.EXE和.COFF

Linker 两者之间的用法差异。a、 out、.ELF、.EXE和.COFF,linker,executable,elf,coff,Linker,Executable,Elf,Coff,请不要看错题目,我知道它们是什么(可移植可执行文件的格式)。但我的兴趣范围略有不同 我的困惑 我参与重新托管/重新定位最初来自第三方的应用程序。问题是,有时目标代码的格式也是.elf、.COFF格式,并且仍然表示“可执行和可链接” 我主要是一个Windows用户,我知道当编译和组装C/C++代码时,会得到类似于.o或.obj的东西。这是不可执行的(好吧,我从来没有尝试过执行它们)。但是,当您完成链接静态库和动态库并完成构建时,将显示可执行文件。我的理解是,如果有必要,您可以继续使用某种形式的脚本

请不要看错题目,我知道它们是什么(可移植可执行文件的格式)。但我的兴趣范围略有不同

我的困惑

我参与重新托管/重新定位最初来自第三方的应用程序。问题是,有时目标代码的格式也是.elf、.COFF格式,并且仍然表示“可执行和可链接”

我主要是一个Windows用户,我知道当编译和组装C/C++代码时,会得到类似于.o或.obj的东西。这是不可执行的(好吧,我从来没有尝试过执行它们)。但是,当您完成链接静态库和动态库并完成构建时,将显示可执行文件。我的理解是,如果有必要,您可以继续使用某种形式的脚本链接可执行文件或“bash”测试它

但是,在Linux(或类似UNIX的系统)中,编译和组装C/C++代码后会有.o文件。链接完成后,可执行文件将以.out格式(至少在Linux的Ubuntu发行版中是这样)。很可能是其他发行版中的elf。在我的快速web搜索中,没有一个来源提到.o文件作为可执行文件

问题

因此,我的问题变成如下:

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

  • Windows和UNIX平台如何以相同的文件格式(.COFF、.elf)覆盖可执行文件和目标代码

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

  • 根据问题1。(可能还有2)我是否需要将符号表(例如.LUM或.MAP文件)与目标代码一起使用?调试符号中的符号,并在不同计算机上重新托管可执行文件/对象文件时使用这些符号

  • 提前感谢您的正确推动。同时,如果有必要,我会继续挖掘和更新问题

    更新

    我设法从某个地方挖了出来:(对我来说似乎有很多东西要吞下

    我主要是一个Windows用户,我知道当你编译你的C/C++代码时,你会得到一些类似于.o或.obj的东西,它们是不可执行的

    嗯,上次我在Windows上编译东西时,编译的结果是一个
    .obj文件,这正是它的名字所暗示的:它是一个。你是对的,它本身不是一个可执行文件。它包含的机器代码(还)没有足够的信息可以直接在CPU上运行

    但是,在Linux(或类似UNIX的系统)中,编译C/C++代码后会有.o文件。链接完成后,可执行文件将以.out格式(至少在Linux的Ubuntu发行版中是这样)。在其他发行版中,它很可能是.elf

    生活在90年代,也就是说:p据我所知,没有现代编译器将
    a.out
    格式作为目标代码的默认输出格式。如果没有指定明确的输出文件名,那么将目标代码放入名为
    a.out
    的文件中,可能是GCC的一种误导性默认做法,但是如果在
    a.out
    ,您会发现它是一个ELF文件。
    a.out
    格式很古老,有点“事实上已经过时”

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

    您已经获得了指向对象文件的Wikipedia链接

    Windows和UNIX平台如何以相同的文件格式(.COFF、.elf)覆盖可执行文件和目标代码

    因为ELF格式(显然也是COFF格式)是这样设计的。为什么不呢?毕竟它只是一个完全相同的机器代码,在所有编译步骤中使用一种文件格式似乎是非常合乎逻辑的。就像我们不喜欢动态库和独立可执行文件使用不同的格式一样。(这就是ELF被称为ELF的原因——它是一种“可执行的可链接格式”。)

    我是否误解了“可链接的”

    我不知道。从你的问题来看,我不清楚你认为“可链接”是什么。一般来说,这意味着它是一个可以链接的文件,即一个库

    基于问题1。(可能还有2)我是否需要将符号表(例如.LUM或.MAP文件)与目标代码一起使用?将符号与调试符号中的符号相同,并在不同机器上重新托管目标文件时使用它们


    我认为这与所使用的可执行文件格式无关。如果要调试,无论发生什么情况,都必须生成调试信息。但如果不需要调试,则可以省略它们。

    我正在更新我的问题(可链接位)。现在应该更好了!@hagubear抱歉,但我根本不理解你的第四个问题。你说的“将符号表与目标代码一起使用”是什么意思?在什么意义上使用?“与目标代码一起使用”在什么意义上?还有,我是“Wiki”维基百科有时会因为不同的人对同一主题有不同的意见而被破坏。我比任何书籍或网站都更尊重stackoverflow,因为像你这样的专家用户实际上可以建设性地批评问题的范围,并分享你对这些问题的知识/理解。因此,我的问题ns在这里而不是wikipedia:)@hagubear我想现在我明白了,请看编辑。是的,堆栈溢出在某些情况下比wikipedia更可信。此外,我还远远不是专家:)谢谢你的H2CO3。请不要忘记我将“compile”修改为“compile and assembly”,因为这对于对象文件而不是汇编代码来说是有意义的。