齐昱博 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
1、课上总结:
(1)、编译链接的过程和ELF可执行文件格式
从一个源代码文件到一个可执行程序文件大概要经历如下过程:
以hello.c为例:
//hello.c
#include <stdio.h>
int main()
{
printf("hello world!");
return 0;
}
(2)、ELF可执行文件格式
ELF中有三种主要的目标文件
查看可执行文件的头部使用readelf指令
可执行文件的头部分别指明了版本号、OS/ABI、ABI的版本号、是可执行文件还是目标文件、入口地址等。
入口地址为程序真正开始的位置,它的地址减去0x8048000的数值为头文件大小。
(3)、使用exec*库函数加载一个可执行文件的过程
静态链接,只要传递命令行参数和环境变量就可以正常工作
动态链接,除了以上两种输入还要一些动态链接库的依赖
动态链接分为可执行程序装载时动态链接和运行时动态链接
在main函数中调用动态加载共享库时需要用到dlopen;
2、实验部分:
实验目标:使用gdb跟踪分析一个execve系统的调用内核处理函数sys_excve
(1)、首先把实验要用到的代码写入test.c中
(2)make rootfs
(3)、使用gdb跟踪,设置断点(sys_execve , load_elf_binary , start_thread)
输入命令触发断点:
第一个断点:
按s,单步执行:
按c,继续执行:
按c,继续执行,发现停在了start_thread,使用命令查看new_ip的值,它等于0x8048d0a,再打开一个shell,使用命令readelf -h hello查看hello的elf头部,可以看到elf头部中的程序入口点地址正是0x8048d0a