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
查看器中表示的意义。