ELF文件和bin文件有什么区别?

时间:2010-03-11 17:01:47

标签: arm elf

编译器生成的最终图像包含bin文件和扩展加载器格式ELf文件,两者之间有什么区别,尤其是ELF文件的实用程序。

5 个答案:

答案 0 :(得分:78)

Bin文件是纯二进制文件,没有内存修复或重定位,很可能它具有在特定内存地址加载的显式指令。而....

ELF文件是可执行链接格式,由符号查找和可重定位表组成,也就是说,它可以由内核加载到任何内存地址,并自动将所有使用的符号调整为偏离加载到的内存地址。通常ELF文件有许多部分,例如'data','text','bss',仅举几例......它位于那些运行时可以计算调整符号内存引用位置的部分内在运行时动态。

答案 1 :(得分:31)

bin文件只是进入rom的位和字节,或者是运行程序的特定地址。您可以直接获取此数据并加载它,您需要知道基本地址是什么,因为通常不在那里。

elf文件包含bin信息,但它包含许多其他信息,可能的调试信息,符号,可以区分代码与二进制文件中的数据。允许多个二进制数据块(当您将其中一个转储到一个bin时,您会得到一个带有填充数据的大bin文件,以将其填充到下一个块)。告诉你你有多少二进制文件以及想要初始化为零的bss数据(gnu工具在正确创建bin文件时遇到问题)。

精灵文件格式是一种标准,它会在标准上公布其增强/变体。我建议每个人都写一个elf解析程序来理解其中的内容,不要打扰库,只需使用规范中的信息和结构就很简单了。帮助克服gnu问题,一般创建.bin文件以及调试链接器脚本和其他有助于弄乱bin或elf输出的东西。

答案 2 :(得分:27)

一些资源:

  1. ARM架构的ELF
    http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044d/IHI0044D_aaelf.pdf
  2. 来自维基的ELF
    http://en.wikipedia.org/wiki/Executable_and_Linkable_Format
  3. ELF格式通常是编译的默认输出。  如果使用GNU工具链,可以使用objcopy将其转换为二进制格式,例如:

      arm-elf-objcopy -O binary [elf-input-file] [binary-output-file]
    

    或使用fromELF实用程序(内置在大多数IDE中,例如ADS):

     fromelf -bin -o [binary-output-file] [elf-input-file]
    

答案 3 :(得分:1)

bin 是内存在 CPU 开始执行之前查看的最终方式。

ELF 是其切割/压缩版本,因此 CPU/MCU 无法直接运行。

(动态)链接器首先必须充分反转(从而将偏移量修改回正确的位置)。
但是 MCU 上没有链接器/操作系统,因此您必须刷新 bin。

此外,Ahmed Gamal is correct
编译和链接是不同的阶段;整个过程称为“构建”,因此 GNU 编译器集合具有单独的可执行文件:

一个用于编译器(技术上输出汇编),另一个用于汇编器(以 ELF 格式输出目标代码), 然后是链接器(将几个目标文件组合成一个 ELF 文件),最后,在运行时,有动态链接器, 这有效地将精灵变成了一个垃圾箱,但纯粹是在内存中,供 CPU 运行。

请注意,通常将整个过程称为“编译”(如 GCC 的名称本身),但在讨论细节时会引起混淆, 例如在这种情况下,艾哈迈德正在澄清。
由于人类语言本身的不精确性,这是一个常见问题。

为了避免混淆,GCC 使用 ELF 格式输出目标代码(在内部使用汇编程序之后)。 链接器简单地获取其中的几个(带有 .o 扩展名),并产生一个组合结果,甚至可能将它们压缩(到“a.out”中)。

但所有这些,甚至“.so”都是 ELF。 就像几个Word文档,每一个都以“.chapter”结尾,都组合成一个最终的“.book”, 其中所有文件在技术上都使用相同的标准/格式,因此可以使用“.docx”作为扩展名。

然后 bin 有点像将书转换为“.txt”文件,同时添加尽可能多的空格以等于最终书的大小(打印在单个线轴上), 与所有图片重叠的地方。

答案 4 :(得分:-1)

我只想在这里纠正一点。 ELF文件是由链接器而不是编译器生成的。

在源代码文件中生成目标文件(* .o)之后,Compiler任务结束。链接器将所有.o文件链接在一起,并生成ELF。