• 可执行文件 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 文件
  • 相关阅读:
    MySQL数据库创建用户并授权查询某个表
    算法题:分别用c++/python/java实现回文数
    js 监控 浏览器关闭前 调用
    检查OpenGL的版本
    Python爬虫之Js逆向案例(13)-某乎最新x-zse-96的rpc方案后续
    秋初 WAMP 集成环境 v2.1
    我与世界杯足球那些事——世界杯征文
    树和图的深度与广度优先遍历(树的重心,图中点的层次)
    算法|图论 2
    docker安装
  • 原文地址:https://blog.csdn.net/weixin_43275558/article/details/126432983