编译器生成的最终图像包含bin文件和扩展的加载程序格式ELf文件,两者之间有什么区别,尤其是ELF文件的实用程序。
编译器生成的最终图像包含bin文件和扩展的加载程序格式ELf文件,两者之间有什么区别,尤其是ELF文件的实用程序。
Answers:
Bin文件是一个纯二进制文件,没有内存修复或重定位,很可能它有明确的指令要加载到特定的内存地址。而...
ELF文件是可执行的可链接格式,它由符号查找和可重定位表组成,也就是说,内核可以将其加载到任何内存地址,并且所有使用的符号都会自动调整为与该内存地址的偏移量。被装入。通常,ELF文件具有多个部分,例如“数据”,“文本”,“ bss”等,但其中有一些...在这些部分中,运行时可以计算出调整符号的内存引用的位置。在运行时动态地。
Bin文件只是进入rom或运行程序的特定地址的位和字节。您可以获取此数据并直接按原样加载它,您需要知道基址是什么,因为该地址通常不在其中。
一个elf文件包含bin信息,但周围有许多其他信息(可能的调试信息,符号)可以将代码与二进制文件中的数据区分开。允许多于一个的二进制数据块(当您将其中一个转储到bin时,您将获得一个包含填充数据的大bin文件,以将其填充到下一个块中)。告诉您有多少二进制文件以及要初始化为零的bss数据有多少(gnu工具在正确创建bin文件时遇到问题)。
elf文件格式是一种标准,arm会在该标准上发布其增强/变化。我建议每个人都编写一个elf解析程序以了解其中的内容,而不必理会库,仅使用规范中的信息和结构就非常简单。帮助克服一般创建.bin文件以及调试链接程序脚本和其他可能会弄乱bin或elf输出的事物的gnu问题。
一些资源:
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]
我只想在这里纠正一点。ELF文件是由链接器而不是编译器生成的。
从源代码文件生成目标文件(* .o)后,编译任务结束。链接器将所有.o文件链接在一起,并生成ELF。
NOP
不带-f
(或-fbin
)的文件,则该文件将被编译为一个字节0x90
,而不是一个包含400个字节的ELF容器-felf32
。所以只有原始代码,没有容器元数据。NASM说,它主要用于MS-DOS .COM和.SYS文件。section
指令通常被忽略,仅产生对齐。