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

由complier生成的最终图像包含bin文件和扩展加载程序格式的ELf文件,这两者之间有什么区别,特别是ELF文件的实用性。

Bin文件是一个纯粹的二进制文件,没有内存修改或重定位,更有可能是明确的指令被加载到特定的内存地址。 然而….

ELF文件是可执行的可链接格式,它由一个符号查找表和可重定位表组成,也就是说,它可以被内核加载到任何内存地址,并自动调用所有使用的符号,被装入。 通常,ELF文件有很多部分,比如'data','text','bss'等,只是其中的一部分而已,这些部分在运行时可以计算出哪里去调整符号的内存引用dynamic运行时。

bin文件只是进入ROM或者将运行程序的特定地址的位和字节。 你可以把这个数据直接加载,你需要知道基地址是什么,因为通常不在那里。

一个elf文件包含bin信息,但是它被许多其他信息包围,可能的debugging信息,符号可以在二进制文件中区分代码和数据。 允许多个二进制数据块(当你将其中的一个转储到一个bin中时,你将得到一个带有填充数据的大bin文件,将其填充到下一个块中)。 告诉你你有多less二进制文件,有多lessbss数据是想要初始化为零(gnu工具在创buildbin文件时有问题)。

精灵文件格式是一个标准,武装发布其标准的增强/变化。 我build议每个人都写一个elfparsing程序来理解里面的东西,不要去打扰一个库,只是使用规范中的信息和结构是很简单的。 帮助克服一般创build.bin文件中的gnu问题,以及debugging链接器脚本和其他可以帮助搞乱bin或elf输出的事情。

一些资源:

  1. ELF为ARM架构
    help/topic/com.arm.doc.ihi0055b/IHI0055B_aapcs64.html
  2. ELF从维基
    http://en.wikipedia.org/wiki/Executable_and_Linkable_Format

ELF格式通常是编译的默认输出。 如果您使用GNU工具链,则可以使用objcopy将其转换为二进制格式,例如:

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

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

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