理解编译链接的过程和 ELF 可执行文件格式,详细内容参考本周第一节;
编程使用 exec*库函数加载一个可执行文件,动态链接分为可执行程序装载时动态链接和运行时动态链接,编程练习动态链接库的这两种使用方式,详细内容参考本周第二节;
使用 gdb 跟踪分析一个 execve 系统调用内核处理函数 sys_execve ,验证您对 Linux 系统加载可执行程序所需处理过程的理解,详细内容参考本周第三节;推荐在实验楼 Linux 虚拟机环境下完成实验。
特别关注新的可执行程序是从哪里开始执行的?为什么 execve 系统调用返回后新的可执行程序能顺利执行?对于静态链接的可执行程序和动态链接的可执行程序 execve 系统调用返回时会有什么不同?
实验
首先激活并查看环境:
cd LinuxeKernel
rm menu -rf
git clone https://github.com/mengning/menu.git
cd menu
mv test_exec.c test.c
make rootfs
MenuOS>>help
MenuOS>>exec
接下来打开一个terminal,冻结内核,然后再重新开启新的terminal进行gdb分析测试:
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
//冻结内核的启动
cd LinuxKernel
gdb
(gdb)file linux-3.18.6/vmlinux
(gdb)target remote:1234
分别在sys_execve、load_elf_binary、start_thread设置断点,进行分析:
总结
在本次实验中,我们深入探讨了Linux内核如何装载和启动一个可执行程序的过程。这一探究包括了编译和链接、动态链接、exec*
库函数以及相关的系统调用等多个方面。通过实际练习、调试和详细分析,我对可执行程序的装载和运行时动态链接过程有了更深入的理解。在使用GDB跟踪sys_execve
系统调用函数的过程中,我进一步加深了对Linux系统如何加载和启动程序的认识。这一实验提供了宝贵的机会,让我更全面地了解了操作系统中关键的程序执行流程。