可执行程序的装载
一,预处理、编译、链接和目标文件的格式
可执行程序是怎么来的?
预处理 把include里的宏定义替换 做字符串处理。
efl格式? 目标文件格式,Windows中用PE Linux中用efl。
静态链接、动态链接?
ABI和文件格式的关系? 二进制兼容。
可重定位文件 可执行文件 共享目标文件
连接器:链接编辑器 ,动态链接器
**当创建或者增加一个进程映像时,系统在理论上会复制文件的一个段到一个虚拟的内存段去。
可执行文件加载到内存中 开始执行第一行代码。
一般情况静态链接会把所有代码放到一个代码段
二,可执行程序、共享库和动态链接
研究可执行程序的装载、执行环境等
先函数调用参数传递,再系统调用参数传递。
装载和运行时的动态链接举例。
三,可执行程序的装载
命令行参数和shell环境,一般我们执行一个程序的Shell环境,我们的实验直接使用execve系统调用。
Shell本身不限制命令行参数的个数,命令行参数的个数受限于命令自身
Shell会调用execve将命令行参数和环境参数传递给可执行程序的main函数
sys_execve内部会解析可执行文件格式
do_execve -> do_execve_common -> exec_binprm
search_binary_handler符合寻找文件格式对应的解析模块
对于ELF格式的可执行文件fmt->load_binary(bprm);执行的应该是load_elf_binary其内部是和ELF文件格式解析的部分需要和ELF文件格式标准结合起来阅读
execve和fork都是特殊的系统调用。
上周已经学习过fork的调用了
通过修改内核堆栈EIP的值来作为新程序执行的起点
ELF可执行文件会默认映射到0x8048000这个地址。
需要动态链接的可执行文件需要先加载链接器ID,将CPU控制权交给链接ID来加载依赖库完成动态链接。装载之后ID将CPU控制权交给可执行程序。
而对于静态链接文件来说 efl_entry是新程序执行起点。
用gdb调试:
new_ip是返回用户态的第一条指令的地址。