可执行文件格式elf和bin

区别

常用的可执行文件包含两类:原始二进制文件(bin)和可加载执行的二进制文件,在linux中可加载执行的二进制文件为elf文件。

BIN文件是直接的二进制文件,内部没有地址标记。bin文件内部数据按照代码段或者数据段的物理空间地址来排列。一般用编程器烧写时从00开始,而如果下载运行,则下载到编译时的地址即可。

在Linux OS上,为了运行可执行文件,他们是遵循ELF格式的,通常gcc -o test test.c,生成的test文件就是ELF格式的。执行elf文件时内核会使用加载器来解析elf文件并执行。

ELF文件格式是一个开放标准,各种UNIX系统的可执行文件都采用ELF格式,它有三种不同的类型:

  • 可重定位的目标文件(Relocatable,或者Object File)
  • 可执行文件(Executable)
  • 共享库(Shared Object,或者Shared Library)
$ file sum.o sub.o test.o libsub.so test
sum.o:     ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
sub.o:     ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
test.o:    ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
libsub.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), not stripped
test:      ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), not stripped

结果很清楚的告诉我们他们都属于哪一个类别。比方 sum.o 是应用在x86架构上的可重定位文件。这个结果也间接的告诉我们,x86是小端模式(LSB)的32位结构。那对于 file 命令来说,它又能如何知道这些信息?答案是在ELF对象文件的最前面有一个ELF文件头,里面记载了所适用的处理器、对象文件类型等各种信息。

ELF格式提供了两种不同的视角,链接器把ELF文件看成是Section的集合,而加载器把ELF文件看成是Segment的集合。

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

文件的内容

1. BIN文件是 raw binary 文件,这种文件只包含机器码。
2. ELF文件除了机器码外,还包含其它额外的信息,如段的加载地址,运行地址,重定位表,符号表等。
所以ELF文件的体积比对应的BIN文件要大。

文件的执行

1. 执行raw binary很简单,只需要将程序加载到其起始地址,就可以执行;

    FILE *fp = fopen("vmlinux.bin", "rb");
    fread(VMLINUX_START, 1, VMLINUX_SIZE, fp);
    ((void (*)(void))VMLINUX_START)();

2. 执行ELF程序则需要一个ELF Loader。
uboot和Linux kernel启动的时候是没有ELF Loader的,所以烧在flash上的文件只能是raw binary格式的,即镜像文件image。

文件的转换

1. 通过gcc编译出来的是elf文件
2. 通过objcpy可以把elf文件转换为bin文件

    CC=ppc-gcc
    LD=ppc-ld
    OBJCOPY=ppc-objcopy
    $(CC) -g $(CFLAG) -c boot.S
    #先将boot.S文件生成boot.o
    $(LD) -g -Bstatic -T$(LDFILE)     -Ttext 0x12345600 boot.o     --start-group -Map boot.map -o boot.elf
    #再将boot.o生成boot.elf
    $(OBJCOPY) -O binary -R .note -R .comment -S boot.elf boot.bin
    #接着将 boot.elf 转换为 boot.bin
    #使用 -O binary (或--out-target=binary) 输出为原始的二进制文件
    #使用 -R .note  (或--remove-section)    输出文件中不要.note这个section,缩小了文件尺寸
    #使用 -S        (或 --strip-all)        输出文件中不要重定位信息和符号信息,缩小了文件尺寸

编译完uboot后生成:
     u-boot         ELF文件可用来调试
     u-boot.bin     BIN文件用来烧在Flash上

编译linux生成:
     vmlinux        ELF文件可用来调试
     vmlinux.bin    BIN文件,没直接用过

zImage/vmlinuz/bzimage
          将vmlinux.bin压缩,并加上一段解压代码得到的,不可和bootloader共存?

uImage        
          uboot专用的内核镜像,在zImage前加了一个64字节的头,描述内核版本、加载地址、生成时间,文件大小等等。 其0x40后的内容和zImage一样。
          它是由uboot的工具mkImage生成的。

uImage相对于zImage的优点在于:uImage可以和uboot共存。

文件的调试

1. 我们调试一般都是使用elf文件,比如:

    nm elf文件         #得到符号表
    objdump -D elf文件 #反汇编,且汇编代码与源码混排

2. bin文件比较杯具,里面全是机器码,所以只能反汇编

objdump -b binary -m powerpc uboot.bin

此外还有工具:readelf,objcopy,ldd,file等。

参考:

1.ELF格式文件和BIN文件的区别

2.可执行文件(ELF)格式的理解

3. 嵌入式系统可执行文件格式

4. Linux中ELF格式文件介绍

5. ELF文件和BIN文件

时间: 2024-10-06 18:03:23

可执行文件格式elf和bin的相关文章

可执行文件(ELF)格式的理解

摘自http://www.cnblogs.com/xmphoenix/archive/2011/10/23/2221879.html 可执行文件(ELF)格式的理解 ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东西.以及都以什么样的格式去放这些东西.它自最早在 System V 系统上出现后,被 xNIX 世界所广泛接受,作为缺省的二进制文件格式来使用.可以说,ELF是构成众多xNIX

Android漫游记(2)---ELF可执行文件格式

ELF是类Unix类系统,当然也包括Android系统上的可执行文件格式(也包括.so和.o类文件).可以理解为Android系统上的exe或者dll文件格式.理解ELF文件规范,是理解Android系统上进程加载.执行的前提.下面我们就来一步步了解这ELF到底是个啥玩意儿(以Arm 32 ELF格式为主)!当然,网上关于ELF的介绍已经非常多,最好的手册还是直接看ELF官方的手册,我这里只是对ELF的文件做个纲领性介绍,然后直奔主题,比如.GOT .PLT或者R_Arm_Jump_Slot,R

嵌入式系统可执行文件格式_转

转自:嵌入式系统可执行文件格式 UBOOT编译映像格式(uboot) UBOOT编译完成后,可以得到u-boot各种格式的映像文件和符号表 u-boot.bin:      u-boot映像原始的二进制格式 u-boot:            u-boot映像的ELF格式 u-boot.srec:     u-boot映像的S-Record格式 u-boot.map:    u-boot映像的符号表 u-boot的3种映像格式都可以烧写到Flash中,但需要看加载器能否识别这些格式.一般u-b

Linux下可执行文件格式详解

Linux下面,目标文件.共享对象文件.可执行文件都是使用ELF文件格式来存储的.程序经过编译之后会输出目标文件,然后经过链接可以产生可执行文件或者共享对象文件.Linux下面使用的ELF文件和Windows操作系统使用的PE文件都是从Unix系统的COFF文件格式演化来的. 我们先来了解一些基本的想法. 首先,最重要的思路是一个程序从人能读懂的格式转换为供操作系统执行的二进制格式之后,代码和数据是分开存放的,之所以这样设计有这么几个原因: 1.程序执行之后,代码和数据可以被映射到不同属性的虚拟

目的檔格式 (ELF)

http://ccckmit.wikidot.com/lk:elf 目的檔ELF 格式(Executable and Linking Format) 是 UNIX/Linux 系統中較先進的目的檔格式.這種格式是 AT&T 公司在設計第五代UNIX (UNIX System V) 時所發展出來的.因此,ELF格式的主要文件被放在規格書 -『System V Application Binary Interface』的第四章的 Object Files當中 ,該文件詳細的介紹了 UNIX Syst

脚本格式之殇——/bin/bash^M: 没有那个文件或目录

Linux下的bash脚本是不支持换行符\r的,如果运行从windows拷贝的文件,出现/bin/bash^M: 坏的解释器: 没有那个文件或目录这样的错误提示,不妨检查下文件格式是否有误. 如果是格式问题,有如下两种方法: 一.查找替换法 第一步: cat -A filename查看'\n及\r空白符,\n会显示为$,而\r会显示为^M`. 第二步: sed -i 's/\r$//'filename替换掉全部\r字符. 二.VIM重置文档格式 第一步: :set ff?查看文件格式,能看到fi

iOS可执行文件格式初探

Mach-O (Mach object) file format? 这种格式的中文资料很少,最详细的还是苹果的官方文档,本文不重复解释mach-o文件格式的内容,只叙述在用ida逆向ios应用程序时的经验. mach-o详细文档参考:https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/MachORuntime/index.html ?mach-o格式可以包含多个目标平台的可执行代码,比如同

实验1 可移植可执行文件格式应用

2.1实验目的 1. 熟悉各种PE编辑查看工具,详细了解PE文件格式2. 重点分析PE文件文件头.引入表.引出表,以及资源表 2.2实验步骤及内容 PE文件格式分析 使用WinHex观察PE文件例子程序test.exe的16进制数据,在屏幕截图中使用图形编辑软件标出该PE文件基本结构的DOS头.PE文件文件头.PE文件可选文件头.数据目录表.导入表.导出表. 2.使用Ollydbg对该程序进行初步调试,了解该程序功能结构,在内存中观察该程序的完整结构. 3.熟悉各类PE文件格式查看和编辑工具(P

linux实践之ELF文件分析

linux实践之ELF文件分析 下面开始elf文件的分析. 我们首先编写一个简单的C代码. 编译链接生成可执行文件. 首先,查看scn15elf.o文件的详细信息. 以16进制形式查看scn15elf.o文件. 查看scn15elf.o中各个段和符号表的信息. 各个段的详细信息如下. 符号表的信息如下: 使用readelf命令查看各个段的详细信息: 段表信息如下: 符号表信息如下: 下面让我们开始分析文件头吧! 由于我的虚拟机是32位的,我下面就主要以32位的系统进行分析,就不比较32位机和64