linux kernel的编译过程比较复杂,最后生成的给用户使用的kernel文件也是多种多样。
先来看一段编译ARM kernel时命令行最后的输出,主要可以分为5个步骤:
- 生成vmlinux
- 生成arch/arm/boot/Image
- 生成arch/arm/boot/compressed/piggy.gzip
- 生成arch/arm/boot/compressed/vmlinux
- 生成arch/arm/boot/zImage
LD vmlinux
SYSMAP System.map
OBJCOPY arch/arm/boot/Image
Kernel: arch/arm/boot/Image is ready
Building modules, stage 2.
GZIP arch/arm/boot/compressed/piggy.gzip
MODPOST 1 modules
CC arch/arm/boot/compressed/misc.o
CC drivers/scsi/scsi_wait_scan.mod.o
CC arch/arm/boot/compressed/decompress.o
CC arch/arm/boot/compressed/string.o
LD [M] drivers/scsi/scsi_wait_scan.ko
AS arch/arm/boot/compressed/piggy.gzip.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
我们来逐步分析每一个步骤:
生成vmlinux
vmlinux生成在kernel的根目录下,大小为28MB。链接文件在arch/arm/kernel/vmlinux.lds。
panzhenjie@panzhenjie-vmware:~/workspace/linux-3.5$ ll
......
-rwxrwxr-x 1 panzhenjie panzhenjie 28289095 9月 1 07:27 vmlinux*
这个vmlinux是一个elf格式的文件,通过readelf命令我们可以看到,这个文件的链接地址是0xc0008000。
从第1段.head.text开始到第22段.bss,一共占用了2MB多的空间,而后面20多MB的数据其实都是些不必要的调试信息。
panzhenjie@panzhenjie-vmware:~/workspace/linux-3.5$ readelf -S vmlinux
There are 36 section headers, starting at offset 0x1a09770:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .head.text PROGBITS c0008000 008000 0001c4 00 AX 0 0 4
[ 2] .text PROGBITS c0008200 008200 1948e4 00 AX 0 0 64
[ 3] .rodata PROGBITS c019d000 19d000 072100 00 A 0 0 64
[ 4] __bug_table PROGBITS c020f100 20f100 0028c8 00 A 0 0 1
[ 5] __ksymtab PROGBITS c02119c8 2119c8 003c28 00 A 0 0 4
[ 6] __ksymtab_gpl PROGBITS c02155f0 2155f0 001988 00 A 0 0