代码改变世界

Linux内核分析07

2016-04-06 10:45  KG35  阅读(256)  评论(0编辑  收藏  举报

可执行程序的装载

一,预处理、编译、链接和目标文件的格式

可执行程序是怎么来的?

预处理  把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是返回用户态的第一条指令的地址。