• 可执行文件 elf 和 bin


    1、区别

      常用的可执行文件包含两类:原始二进制文件(bin)和可加载执行的二进制文件,在linux中可加载执行的二进制文件为 elf 文件。
      BIN文件是直接的二进制文件,内部没有地址标记。bin文件内部数据按照代码段或者数据段的物理空间地址来排列。一般用编程器烧写时从00开始,而如果下载运行,则下载到编译时的地址即可。
      在Linux OS上,为了运行可执行文件,他们是遵循 ELF 格式的,通常 gcc -o test test.c,生成的 test 文件就是 ELF 格式的。执行 ELF 文件时内核会使用加载器来解析ELF 文件并执行。

      关于 ELF 文件的相关知识,在我前面的文章中有详细的讲解,这里就不再细说。下面给出链接。

    程序员自我修养之链接、装载与库笔记

      在 Embedded(嵌入式)中,如果上电开始运行,没有 OS 系统,如果将 ELF 格式的文件烧写进去, 包含一些 ELF 文件的符号表字符表之类的section,运行碰到这些,就会导致失败,如果用 objcopy 生成纯粹的二进制文件,去除掉符号表之类的 section,只将代码段数据段保留下来,程序就可以一步一步运行。elf 文件里面包含了符号表等。BIN 文件是将elf文件中的代码段,数据段,还有一些自定义的段抽取出来做成的一个内存的镜像。并且 ELF 文件中代码段数据段的位置并不是它实际的物理位置,实际物理位置是在表中标记出来的。

    1.1 文件内容
    1. BIN文件是 raw binary 文件,这种文件只包含机器码。
    2. ELF文件除了机器码外,还包含其它额外的信息,如段的加载地址,运行地址,重定位表,符号表等。所以ELF文件的体积比对应的BIN文件要大。
    1.2 文件的执行
    1. 执行raw binary很简单,只需要将程序加载到其起始地址,就可以执行;
    FILE *fp = fopen("vmlinux.bin", "rb");
    fread(VMLINUX_START, 1, VMLINUX_SIZE, fp);
    ((void (*)(void))VMLINUX_START)();
    
    • 1
    • 2
    • 3
    1. 执行 ELF 程序则需要一个ELF Loader。
      uboot 和 Linux kernel 启动的时候是没有ELF Loader的,所以烧在flash上的文件只能是raw binary格式的,即镜像文件image。
    1.3 elf 和 bin文件的转换
    1. 通过 gcc 编译出来的是 ELF 文件
    2. 通过 objcpy 可以把 ELF 文件转换为 bin 文件
  • 相关阅读:
    深入理解重写equals()方法
    LeetCode每日一题(2149. Rearrange Array Elements by Sign)
    用一个结构去分割二维空间
    舍不得花钱买1stOpt,不妨试试这款免费的拟合优化神器【openLU】
    pthread_mutex_t互斥量
    CodeForces Round #817 (div.4) A~F
    Unity技术手册 - 生命周期旋转RotationOverLifetime-速度旋转RotationBySpeed-外力ExternalForces
    牛客小白月赛55
    1. Gradle是什么,Gradle与Maven有什么不同
    LeetCode_55_跳跃游戏
  • 原文地址:https://blog.csdn.net/weixin_43275558/article/details/126432983