linux内核完全剖析---linux0.00-050613/rh9 makefile分析
boot.s简单的引导程序,head.s简单内核,makefile内容如下
# Makefile for the simple example kernel.
AS86 =as86 -0 -a
LD86 =ld86 -0
AS =as
LD =ld
LDFLAGS =-m elf_i386 -Ttext 0 -e startup_32 -s -x -M
all: Image
Image: boot system
dd bs=32 if=boot of=Image skip=1
objcopy -O binary system head
cat head >> Image
disk: Image
dd bs=8192 if=Image of=/dev/fd0
sync;sync;sync
head.o: head.s
system: head.o
$(LD) $(LDFLAGS) head.o -o system > System.map
boot: boot.s
$(AS86) -o boot.o boot.s
$(LD86) -s -o boot boot.o
clean:
rm -f Image System.map core boot head *.o system
1.boot: boot.s ,这一阶段使用了as86汇编器和ld86链接器生成了16位的目标文件, 使用file boot.o 得到 boot.o: Linux-8086 object file
使用file boot 得到boot: Linux-8086 impure executable (为什么不是x86 boot sector, code offset 0x5,是因为ld86链接加上了头,而且boot的大小为544
2.head.o : head.s ,这一阶段使用了makefile的隐含规则,即:as -o head.o head.s file head.o 得到:head.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped,(as 默认生成elf格式目标文件)
3.system: head.o,这一阶段链接head.o LDFLAGS =-m elf_i386 -Ttext 0 -e startup_32 -s -x -M, 指定了仿真格式 elf_i386 , .text段地址为0, 入口函数是startup_32 -s 删除符号信息 -x 丢弃局部符号 -M 打印链接图文件
4.Image: boot system,这一阶段生成Image(boot和head文件cat而成),file Image 得到:Image: x86 boot sector, code offset 0x5, 红色那一行意思是:
将elf格式的system转换为原生二进制head, file system得到:system: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, stripped
,file head得到:head: COM executable for DOS.如果不转换的话是不能正确运行的,虽然boot把head读到了0地址处,而且ld也指明了text段地址为0,入口地址为0,但是此时地址0处并不是.text而是elf header ,ld只是指明了文件的.text段要在0地址处,所以加载器要读取这个信息,然后把.text段放到0地址处,但是我们这个例子中,是整个elf文件在0地址处,所以不能运行
5,disk: Image,这一阶段主要是虚拟软盘的问题,用dd命令或者bximage命令得到的不是虚拟软盘只是一个数据块儿,想要得到虚拟软盘,两种方法,1.挂载到dos里面,将其格式化 2.写引导扇区,而且引导扇区要有引导功能.