可执行文件格式
Bin
flash上的需要直接运行的只能是raw binary格式的文件,BIN是将elf文件中的代码段,数据段,还有一些自定义的段抽取出来做成的一个内存的镜像,可以被CPU 运行的二进制文件。比如uboot
Elf
executable and link format,文件里面包含了符号表,汇编等;ELF格式是在有操作系统时,操作系统会根据ELF解析出代码、数据等等,最终仍是以BIN运行。由于elf文件的信息比较全,所以可以用来以单步跟踪的方式运行和GDB 调试。执行ELF程序则需要一个ELF Loader,比如kernel
Uboot
编译完成会生成elf格式的u-boot;通过OBJCOPY生成二进制文件uboot.bin;经过MKIMAGE生成uboot.img
LD u-boot
OBJCOPY u-boot.srec
OBJCOPY u-boot-nodtb.bin
SYM u-boot.sym
COPY u-boot.bin
MKIMAGE u-boot.img
CFGCHK u-boot.cfg
Kernel
vmlinux是Linux内核编译出来的原始的elf格式de 内核文件,未做压缩处理。该映像可用于定位内核问题,比如内核出现oops;可通过反汇编vmlinux判断出现问题的位置发生了社么操作;但不能直接引导Linux系统启动,会通过OBJCOPY生成二进制文件Image;再通过gzip和objcopy生成zImage
LD vmlinux
SORTEX vmlinux
SYSMAP System.map
OBJCOPY arch/arm/boot/Image
Kernel: arch/arm/boot/Image is ready
GZIP arch/arm/boot/compressed/piggy_data
AS arch/arm/boot/compressed/piggy.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
用户态程序
上面说到了uboot和kernel的格式问题,我们接着说下linux的应用程序的主要格式elf;中间目标文件".o"以及静态库".a"和动态链接库".so"文件都属于ELF文件;一般我们在shell中来执行我们的应用程序,比如ls,cat或者我们刚编译的测试程序,其原理就是先用fork建立子进程,子进程再通过execve系统调用运行我们的程序