ELF与BIN文件区别

  • Post author:
  • Post category:其他



Gcc

编译出来的是

ELF

文件。通常

gcc –o test test.c,

生成的

test

文件就是

ELF

格式的,在

linuxshell

下输入

./test

就可以执行。


Bin

文件是经过压缩的可执行文件,去掉

ELF

格式的东西。是直接的内存映像的表示。在系统没有加载操作系统的时候可以执行。


elf



executable  and   link   format

)文件里面包含了符号表,汇编等。


BIN


文件是将

elf

文件中的代码段,数据段,还有一些自定义的段抽取出来做成的一个内存的镜像。










Embedded



中,如果上电开始运行,没有



OS



系统,如果将



ELF



格式的文件烧写进去,包含一些



ELF



格式的东西,



arm



运行碰到这些指令,就会导致失败,如果用



arm-softfloat-linux-gnu-objcopy



生成纯粹的汇编



bin



文件,程序就可以一步一步运行。




两种文件都可以运行



机器最终只认

BIN

,之所以有

ELF

格式是在有操作系统时,操作系统会根据

ELF

解析出代码、数据等等,最终仍是以

BIN

运行。由于

elf

文件的信息比较全,所以可以用来以单步跟踪的方式运行。关键是看

loader





嵌入式开发的时候,我们的编译一个



*.S



文件,并最终生成



bin



文件,编译命令大致如下:


CC=arm-softfloat-linux-gnu-gcc


LD=arm-softfloat-linux-gnu-ld


OBJCOPY=arm-softfloat-linux-gnu-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 -oboot.elf    #



再将



boot.o



生成



boot.elf,boot.elf



通常就是可执行文件,类似于



gcc-o test test.c



中的



test



文件,在



LinuxShell



下输入



./test



就可以执行。


$(OBJCOPY)-O binary boot.elf boot.bin    #



接着将



boot.elf->boot.bin



,这样可以缩小代码尺寸。




运行



arm-softfloat-linux-gnu-objdump-h boot.elf



可以查看该文件的信息,但是如果变成


arm-softfloat-linux-gnu-objdump-h boot.bin



会提示错误,为了看



boot.bin



文件信息



,



输入:


arm-softfloat-linux-gnu-objdump-h -b binary -m arm boot.bin



就可以了。哈哈我也是现学了一招,其中参数



-h



可以被替换成为



-D, -S,-s



等等,请用



arm-softfloat-linux-gnu-objdump–help



查看器中表示的意义。