可执行文件 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. 执行 ELF 程序则需要一个ELF Loader。
    uboot 和 Linux kernel 启动的时候是没有ELF Loader的,所以烧在flash上的文件只能是raw binary格式的,即镜像文件image。
1.3 elf 和 bin文件的转换
  1. 通过 gcc 编译出来的是 ELF 文件
  2. 通过 objcpy 可以把 ELF 文件转换为 bin 文件

你可能感兴趣的:(计算机杂说,elf,bin,可执行文件,objcopy,c)