Arm ELF文件和bin文件之间有什么区别?

Arm ELF文件和bin文件之间有什么区别?,arm,elf,Arm,Elf,编译器生成的最终图像包含bin文件和扩展加载程序格式的ELf文件,两者之间的区别是什么,特别是ELf文件的实用性。bin文件是一个纯二进制文件,没有内存修复或重新定位,很可能在特定的内存地址加载明确的指令。鉴于 文件是可执行的可链接格式,由符号查找和可重定位表组成,也就是说,内核可以将其加载到任何内存地址,并且使用的所有符号都会自动调整到其加载到的内存地址的偏移量。通常ELF文件有许多部分,例如“数据”、“文本”、“bss”,仅举几个部分……运行时可以在这些部分中计算在运行时动态调整符号内存引用

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

bin文件是一个纯二进制文件,没有内存修复或重新定位,很可能在特定的内存地址加载明确的指令。鉴于

文件是可执行的可链接格式,由符号查找和可重定位表组成,也就是说,内核可以将其加载到任何内存地址,并且使用的所有符号都会自动调整到其加载到的内存地址的偏移量。通常ELF文件有许多部分,例如“数据”、“文本”、“bss”,仅举几个部分……运行时可以在这些部分中计算在运行时动态调整符号内存引用的位置。

一些资源:

  • 用于ARM体系结构的ELF
  • 来自wiki的ELF
  • ELF格式通常是编译的默认输出。 如果使用GNU工具链,可以使用objcopy将其转换为二进制格式,例如:

      arm-elf-objcopy -O binary [elf-input-file] [binary-output-file]
    
    或者使用fromELF实用程序(尽管是在大多数IDE中构建的,比如ADS):


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

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


    elf文件格式是一种标准格式,arm在该标准上发布其增强功能/变体。我建议每个人都编写一个elf解析程序来理解其中的内容,不要麻烦使用库,只使用规范中的信息和结构非常简单。这有助于克服gnu在创建.bin文件以及调试链接器脚本和其他可能导致bin或elf输出混乱的问题。

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


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

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

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

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

    此外,.
    编写和链接是两个独立的阶段;整个过程称为“构建”,因此GNU编译器集合有单独的可执行文件:

    一个用于编译器(技术上输出汇编),另一个用于汇编程序(以ELF格式输出目标代码), 然后是一个链接器(它将多个对象文件组合成一个ELF文件),最后是运行时的动态链接器, 这有效地将elf转换为一个容器,但纯粹是在内存中,以便CPU运行

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

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

    但他们所有人,甚至“.so”都是精灵。 它就像几个Word文档,每个文档都以“.chapter”结尾,所有文档都被合并成一个最终的“.book”, 所有文件在技术上使用相同的标准/格式,因此扩展名可能为“.docx”

    这个箱子就像是将书转换成一个“.txt”文件,同时添加尽可能多的空格,使之与最终书的大小相等(打印在一个线轴上),
    用于覆盖所有图片的位置。

    “它很可能有明确的指令要加载到特定的内存地址”:这是否意味着bin文件生成过程添加了额外代码,用于将数据加载到特定地址?据我所知,bin文件类似于从偏移量0运行程序,数据段嵌入其中。如果这是错误的,请纠正我。@MartinKersten correct,bin文件从偏移量0开始。@t0mm13b因此.elf文件可以像普通的.hex文件一样刻录到微控制器上,但它需要更多的闪存,并且每次重置微控制器时,部分地址都会更改?@blackyduck,我不相信这是可能的。如果微控制器试图直接执行ELF数据,它会将标题和其他数据误解为指令,对吗?。不是特定于ARM,但可能是相同的概念。例如,如果编译的文件只包含
    NOP
    ,而不包含
    -f
    (或
    -fbin
    ),则它将编译为单个字节
    0x90
    ,而不是包含
    -felf32
    的400字节ELF容器。所以只有原始代码,没有容器元数据。NASM说它主要用于MS-DOS.COM和文件<代码>部分指令大部分被忽略,只生成对齐。这是bin文件有用的一种方式:将引导扇区设置为d
     fromelf -bin -o [binary-output-file] [elf-input-file]