2010-03-11 108 views
71

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

+0

[这是NASM必须说的](http://www.nasm.us/doc/nasmdoc7.html#section-7.1)。不是ARM特定的,但可能是相同的概念。例如,如果你编译的文件只包含没有'-f'(或'-fbin')的'NOP',它就会编译成单个字节'0x90',而不是带有'-felf32'的400字节ELF容器。所以只需要原始代码,不需要容器元数据。 NASM称它主要用于MS-DOS .COM和[.SYS](https://en.wikipedia.org/wiki/.sys)文件。 'section'指令大多被忽略,只会产生对齐。 – 2015-04-29 09:54:31

+0

这是bin文件有用的一种方式:使引导扇区部署操作系统:http:// stackoverflow。com/a/32483545/895245 – 2015-09-17 17:57:14

回答

71

Bin文件是一个纯粹的二进制文件,没有内存修改或重定位,很可能它有明确的指令要加载到特定的内存地址。鉴于......

ELF文件是可执行的可链接格式,它由符号查找和可重定位表组成,也就是说,它可以由内核加载到任何内存地址,并自动调整所有使用的符号到从它加载到的内存地址的偏移量。通常,ELF文件有很多部分,比如'data','text','bss'等等,它们在运行时可以计算出哪里调整符号的内存引用的地方动态运行时。

+0

“很可能它有明确的指令要加载到特定的内存地址”:这是否意味着bin文件生成过程会添加额外的代码来将数据加载到特定地址? – xiaobai 2014-05-28 14:44:21

+1

据我所知,bin文件就像运行偏移量为0的程序并且数据段被嵌入其中一样。如果这是错误的,请纠正我。 – 2015-04-09 01:26:15

+0

@MartinKersten正确,bin文件从偏移量0开始。 – t0mm13b 2015-06-01 00:37:04

21

一些资源:

  1. ELF针对ARM架构
    http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044d/IHI0044D_aaelf.pdf
  2. ELF从维基
    http://en.wikipedia.org/wiki/Executable_and_Linkable_Format

ELF格式通常是编译的默认输出。

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

或使用fromELF实用程序(建于大多数IDE如ADS虽然): 如果你使用GNU工具链,可以将它通过使用objcopy命令,如转换为二进制格式

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

-1。这并不回答有关bin文件是什么的问题。 – xiaobai 2014-05-28 14:31:05

+6

这是在bin文件详细信息被回答后添加的,而* does *附加了一个实际有用的技术。 +1。 – erbdex 2015-05-31 23:48:52

26

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

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

elf文件格式是一种标准,arm发布其标准的增强/变体。我建议每个人都写一个elf解析程序来理解它里面的内容,不要去打扰一个库,只是使用规范中的信息和结构非常简单。帮助克服gnu问题,一般创建.bin文件,以及调试链接器脚本和其他可以帮助搞乱bin或elf输出的东西。

相关问题