中国教育在线 中国教育网 加入收藏 设为首页

linux内核装载elf过程简介

http://itpx.eol.cn  来源:  作者:中国IT实验室收集整理  2011-06-03    

  首先再用户层面,bash进程会调用fork函数创建一个新的进程,然后新的进程调用execve系统调用执行指定的elf文件,原先bash进程继续返回等待刚才启动的新进程结束。然后等待用户输入命令。

  int execve(const char *filename,char *const argv[],char *const envp[]);

  分别是被执行的程序文件名,执行参数和环境变量。

  glibc对execvp进行了包装,提供了execl(),execlp(),execle(),execvp()等不同形式的api.但是最总都会调用execve()。

  1、进入系统调用后,linux内核看是真正的装载工作。在内核中,系统调用相应的入口是sys_execve()。被定义在arch\i386\kernel\process.c.

  2、进行一些参数的检查赋值以后就调用do_execve()。首先检查被执行的文件,找到文件就读取128个字节。来判断文件的格式(有。/a.out elf  脚本等)。就是比对魔数。

  3、do_execve() 调用search_binary_handle()搜索和匹配合适的可执行文件装载处理过程。比如elf的函数是load_elf_binary()。

  load_elf_binary()定义再fs/Binfmt_elf.c:

  a、检查ELF可执行文件的有效性,比如魔数,段的数量。

  b、寻找。interp段,设置动态连接器的路径。

  c、根据elf可执行文件的程序头表的描述,对elf文件进行映射。

  d、初始化elf进程环境,比如启动时候EDX的地址是DT_FINI的地址。

  f、将系统调用的返回地址修改为elf可执行文件的入口点,这个入口点取决于程序的链接方式,对于静态链接的elf可执行文件,就是e_entry所存的地址。对于动态链接的elf可执行文件就是动态连接器。

  4、执行完毕后,lcad_elf_binary(),返回到do_execve()再返回到sys_execve()。

  5、sys_execve()从内核态返回到用户态,同时返回第五步已经更改的程序入口地址。eip存储器直接跳转到elf程序的入口地址,新进程执行。

推荐给好友    我要收藏    我要纠错    分享到

免责声明:

① 凡本站注明“稿件来源:中国教育在线”的所有文字、图片和音视频稿件,版权均属本网所有,任何媒体、网站或个人未经本网协议授权不得转载、链接、转贴或以其他方式复制发表。已经本站协议授权的媒体、网站,在下载使用时必须注明“稿件来源:中国教育在线”,违者本站将依法追究责任。

② 本站注明稿件来源为其他媒体的文/图等稿件均为转载稿,本站转载出于非商业性的教育和科研之目的,并不意味着赞同其观点或证实其内容的真实性。如转载稿涉及版权等问题,请作者在两周内速来电或来函联系。

内容推荐
eol.cn简介 | 联系方式 | 网站声明 | 京ICP证140769号 | 京ICP备12045350号 | 京公网安备 11010802020236号
版权所有 北京中教双元科技集团有限公司 EOL Corporation
Mail to: webmaster@eol.cn