一 理解编译链接的过程和ELF可执行文件格式
这张图说明了可执行程序的产生
大致过程为
.c文件汇编成汇编代码.asm,
然后再汇编成目标码.o,
然后链接成可执行文件a.out,
这时可执行文件就可以加载到内存中执行了。
目标文件的格式
目标代码(objectcode)指计算机科学中编译器或汇编器处理源代码后所生成的代码,它一般由机器代码或接近于机器语言的代码组成。目标文件(objectfile)即存放目标代码的计算机文件,它常被称作二进制文件(binaries),这种文件是体系结构相关的。Linux下的目标文件为ELF(Excutable and Linking Format)格式文件。
三种类型的目标文件
1.可重定位目标文件(relocatable *.o)包含代码节和数据节。此文件适合与其他可重定位目标文件链接,从而创建动态可执行文件、共享目标文件或其他可重定位目标文件。
2.动态可执行文件(executable)包含可随时执行的程序。此文件指定了 exec(2) 创建程序的进程映像的方式。此文件通常在运行时绑定到共享目标文件以创建进程映像。
3.共享目标文件文件(shared object *.so)包含适用于进行其他链接的代码和数据。链接编辑器可将此文件与其他可重定位目标文件和共享目标文件一起处理,以创建其他目标文件。运行时链接程序会将此文件与动态可执行文件和其他共享目标文件合并,以创建进程映像
二 实验过程
打开实验楼cd LinuxKernel 进入LinuxKernel目录,删除已有的menu,使用的命令为 rm menu -rf,然后使用命令git clone http://github.com/mengning/menu.git 克隆menu,并进入menu。
之后使用test_fork.c覆盖test.c,使用的命令为mv test_fork.c test.c,因为之前使用过test.c以防再次使用test.c有影响,然后在menu目录下执行make rootfs 就可以将其编译出来
输入help发现多了一项fork
输入fork,看到创建的父进程以及子进程输出信息
然后进入调试状态,首先执行命令 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd ../rootfs.img -s -S
设置几个断点
开始执行,3个c后执行结束
list然后继续s跟踪
从do fork开始,使用命令n 进行处理
发现返回到用户态