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

2024-01-12

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

我的困惑

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

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

但是,在 Linux(或类 UNIX 系统)中,编译和汇编 C/C++ 代码后会生成 .o 文件。一旦链接完成,可执行文件就是 a.out 格式(至少在 Linux 的 Ubuntu 发行版中是这样)。它很可能是其他发行版中的 .elf。在我的快速网络搜索中,没有任何来源提到有关 .o 文件作为可执行文件的任何内容。

问题

因此我的问题变成了以下内容:

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

  2. Windows 和 UNIX 平台如何在同一文件格式(.COFF、.elf)下涵盖可执行代码和目标代码?

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

  4. 基于问题 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.outformat 作为目标代码的默认输出格式。也许将目标代码放入名为的文件中是 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(使用前将#替换为@)

之间的用法差异。 a.out、.ELF、.EXE 和 .COFF 的相关文章

  • 如何调试 STL/C++ 的 GCC/LD 链接过程

    我正在用 C 开发裸机 cortex M3 以获取乐趣和利润 我使用 STL 库 因为我需要一些容器 我认为通过简单地提供我的分配器 它不会向最终的二进制文件添加太多代码 因为您只得到您使用的内容 实际上我根本没想到与 STL 有任何链接过
  • 读取 ELF 部分的内容(以编程方式)

    我正在尝试检索 ELF 二进制文件中附加部分的内容 此时 我使用以下代码来检索每个部分的名称 include
  • C 链接错误:未定义对“main”的引用

    我试图将多个 C 程序链接在一起 但收到错误响应 gcc o runexp o scd o data proc o lm fopenmp usr lib gcc x86 64 linux gnu 4 6 x86 64 linux gnu c
  • 在 CMake 中添加多个可执行文件

    我在 C 项目中的代码组织如下 我有一些 cpp and h包含我的课程的文件 我有一些 cxx必须针对以下内容进行编译的文件 cpp文件和一些外部库 现在 每个 cxx文件有一个main 方法 因此我需要为每个与该文件同名的文件添加不同的
  • gcc 链接器获取未使用对象的列表

    我想识别具有许多库的大型 C 应用程序中未使用的目标文件 随着时间的推移 该项目已经增长了很多 现在我想搜索不再使用的库 以便我可以从依赖项文件中删除它们 gcc 链接器是否可以识别任何未使用的对象 例如 如果我使用 gcc 编译一个应用程
  • 为什么 Linux/gnu 链接器选择地址 0x400000?

    我正在 Linux x86 64 上试验 ELF 可执行文件和 gnu 工具链 我已经链接并剥离 手动 Hello World 测试 global start text start mov 1 rax 转换为 267 字节 ELF64 可执
  • 在应用程序中嵌入 C++ 编译器

    着色器不是很酷吗 您可以只输入一个纯字符串 只要它是有效的源 它就会编译 链接和执行 我想知道是否有一种方法可以将 GCC 嵌入到用户应用程序中 以便它 自给自足 例如具有编译与其自身兼容的本机二进制文件的内部功能 到目前为止 我一直在从应
  • 构建不使用 CRT 函数的 Visual C++ 应用程序仍然引用一些

    这是至少两个密切相关但又截然不同的一系列问题的一部分 我希望通过分别询问他们来做正确的事情 我正在尝试让我的 Visual C 2008 应用程序在没有 C 运行时库的情况下运行 它是一个 Win32 GUI 应用程序 没有 MFC 或其他
  • 链接对象文件时出现“未定义的引用”错误[重复]

    这个问题在这里已经有答案了 我意识到这个问题已经通过多种方式提出 包括这个非常全面的答案 https stackoverflow com questions 12573816 what is an undefined reference u
  • 符号 __module_registered 错误的重复定义

    我从 GHCi 收到一条关于 符号 module registered 的重复定义 的错误消息 如下所示 GHCi runtime linker fatal error I found a duplicate definition for
  • ws2_32.lib 与 libws2_32.a,有什么区别以及如何将 libws2_32 链接到 NB 项目?

    我使用 NetBeans Windows 和 Cygwin 以及 g 编译器 我正在研究 Windows Sockets 2 我所做的一切都是用 MS 编写的manual http msdn microsoft com en us libr
  • 符号查找错误未定义符号,但所有符号似乎都存在

    可执行文件似乎无法解析链接库中的符号 LD DEBUG libs 的相关输出表明加载了正确的库 6557 usr lib libcharon so 0 error symbol lookup error undefined symbol a
  • 在 EXE 文件末尾写入字节安全吗?

    我听说如果我们在 EXE 文件末尾附加一些字节 它仍然可以正常工作 在所有情况下都是如此吗 这是一种安全的方法吗 我打算使用程序执行文件中的数据来编写演示 因此它可以是安全的 至少对普通用户而言 并且我不必将数据存储在其他地方 这是不可能用
  • gcc 4.5 中在链接方面引入的更改?

    我有一个项目生成一个共享库 该库与另一个共享库链接 当我用 gcc 4 4 编译并链接它时 一切正常 没有编译时警告或错误 没有链接时间警告或错误并且 ldd libmyproject so正确报告与其他共享库的依赖关系 另一方面 当我用
  • 使用 Pyinstaller 将 Django 项目转换为 .exe - 缺少模块、ModuleNotFoundError

    我正在使用 Pyinstaller 将 Django 项目转换为 exe 文件 我希望能够只需单击一个图标并在浏览器中打开该项目 这是我的文件夹结构 proj pycache proj pycache init py manage py D
  • ns_initparse 的链接器错误

    这是代码 include
  • 修改编译共享库中符号的可见性

    我的项目依赖于一个第三方库 该库导出了更多应有的符号 其中一些符号被其他库和主程序无意地覆盖 如何更改已编译共享对象的函数和变量的可见性 如何更改已编译共享对象的函数和变量的可见性 您可以通过修改动态符号部分来更改符号的可见性 dynsym
  • 可运行的 JAR 无法与引用的库一起使用

    我想创建一个可运行的 JAR 其中包含引用的库 即jackson http jackson codehaus org 在 Eclipse 中通过导出 过去有fat jar这似乎是 Eclipse 提供导出到可运行 JAR 之前的 goto
  • 找不到 assimp-vc140-mt.dll ASSIMP

    我已经从以下位置下载了 Assimp 项目http assimp sourceforge net main downloads html http assimp sourceforge net main downloads html Ass
  • 在 Mac OS X 上构建 Linux 内核

    我正在做一个修改Linux内核的项目 我有一台桌面 Linux 机器 在上面构建内核没有问题 不过 我要去旅行 我想在途中工作 我只有一台 MacBook 当我尝试构建 Linux 内核时 它抱怨说elf h was not found 我

随机推荐

  • 如何在 Spring Data JPA 中编写动态原生 SQL 查询?

    我需要在 Spring Boot Web 应用程序中的数据库中的多个表上编写搜索查询 它使用 spring data jpa 我知道我们可以使用 Query 注释和 native true 标志在 spring data jpa 中编写本机
  • 实体框架核心:无法添加迁移:没有无参数构造函数

    我的数据项目参考 Entity Framework Core
  • 有效检测损坏的 jpeg 文件?

    有没有一种有效的方法来检测 jpeg 文件是否损坏 背景资料 解决方案需要在 php 脚本内工作jpeg 文件位于磁盘上无法手动检查 用户上传的数据 我知道imagecreatefromjpeg string filename 可以做到 但
  • Python ascii utf Unicode

    当我解析这个 XML 时p xml parsers expat ParserCreate
  • 使用 OAuth 时 Instagram 返回“未找到匹配代码或已使用”

    我正在尝试使用Instagram OAuth使用开发人员文档 https www instagram com developer authentication https www instagram com developer authen
  • 在元素后插入仅打开的 HTML 标签?

    我想在页面上的 H1 元素后面插入几个开始 DIV 标记 而不插入相应的结束标记 因为结束标记包含在我无权访问的包含页脚文件中 IE 现有代码 h1 Heading One h1 page content 新代码 h1 Heading On
  • Nginx 重写或内部重定向循环,同时内部重定向到“/index.html”

    我使用 Php 框架在 nginx 上实现 Web 服务器 没有任何 index html 网页工作正常 但某些脚本无法工作 它显示 500 内部服务器错误 这是服务器日志 2016 11 16 11 08 38 错误 2551 0 738
  • Google Play 应用内结算版本 3:因“已拥有的项目”而崩溃并缺少失败通知

    在 最终 发布 Google Play 应用内结算的 v2 实现之后 除了发布后的问题之外 我什么也没遇到 交易失败 崩溃 无法恢复 诸如 无法下载 您已经拥有该项目 之类的疯狂错误 以及各种其他荒谬的事情 老实说 我现在已经在 iOS A
  • MultipartFormDataStreamProvider 清理

    如果文件发布到我的网络应用程序 那么我通过以下方式读取它们MultipartFormDataStreamProvider FileData 我像这样初始化提供者 string root HttpContext Current Server
  • Spring Ldap - 多个基本名称

    我正在尝试使用 spring LDAP ODM 从 LDAP 接收一些属性 有没有办法在中配置多个基本名称
  • Sprintf 重复值

    这是一个简单的问题 我需要在 sprintf 函数中复制值 sprintf s s s arg1 arg1 arg2 我怎样才能只传递 arg1 一次 似乎无法在 php net 上找到答案 Thanks Andrew 使用索引格式 1 s
  • 如何通过代理连接不和谐机器人

    我正在尝试使用discord py 并通过代理运行discord 机器人 这关于此的不一致文档 https discordpy readthedocs io en latest api html highlight proxy discor
  • 如何从 VB6 .frx 文件中提取图像?

    我正在将一些 VB6 代码转换为 C VB6 将资源存储在 frx文件 与 C 存储它的方式相同 resx文件 如何将图像转换为 frx文件到可以嵌入的东西 resx file 这是部分答案 有一个实用程序可用于执行提取部分 Gfx来自Fr
  • Rails 中的 j 函数有什么作用?

    我刚刚发现一个博客提到jRails 中的函数 他们用它来进行 ajax 样式的页面更新 cart html 我知道他们正在使用部分来渲染cart部分 但有什么意义j 我发现一些文章说它将字符串转换为 JavaScript 可以接受的内容 但
  • 滚动视图中的线性布局不占据整个高度

    我有一个线性布局说V1 在L1内部我有一个滚动视图V2 在滚动视图内部我有另一个线性布局V3 现在V3有一个gridtview V4 PBM 是 如果我的列表视图有 6 个项目 则只有 2 个项目可见 对于其余的 即使我看到有足够的空白空间
  • 如何以非阻塞的方式组合可观察量?

    我有一个 Observables 集合 每个 Observables 检索不同的数据类型 我将这些 Observable 链接起来以获取页面所需的所有数据 事实上 所有这些信息都是独立的 因此加载一个信息不应阻止或干扰加载其他信息 这是我无
  • 查找两个网页之间的最短路径

    我需要找到两个维基百科页面之间的最短距离 以 跃点 为单位 我有一种方法可以提取页面上的所有内部 wiki 链接 我知道起始目的地和结束目的地 但我对如何从数据中提取跃点一无所知 到目前为止 我一直在使用链接提取方法来填充字典 其中键是页面
  • 最简单、简约、opengl 3.2 cocoa项目

    我已经使用旧版 openGL 和 cocoa 多年了 但现在我正在努力过渡到 openGL 3 2 互联网上有几个例子 但它们都太复杂了 许多甚至在 XCode 5 1 下不再编译 有人可以编写一个最简单 简约 最小的可可代码示例 只是为了
  • 如何使用 rjags / JAGS 的估计值来预测值

    设置模型并使用吉布斯采样对其进行训练后 我得到了所有隐藏值预测的结果 jags lt jags model example bug data data n chains 4 n adapt 100 update jags 1000 samp
  • 之间的用法差异。 a.out、.ELF、.EXE 和 .COFF

    请不要看问题标题误会我的意思 我知道它们是什么 可移植可执行文件的格式 但我的兴趣范围略有不同 我的困惑 我参与了最初来自第三方的重新托管 重定向应用程序 问题是 有时目标代码的格式也是 elf COFF 格式 但仍然显示 可执行且可链接