查看: 4171|回复: 0

linux内核装载elf过程简介

[复制链接]
发表于 2011-6-9 09:24:25 | 显示全部楼层 |阅读模式
台州网址导航
首先再用户层面,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程序的入口地址,新进程执行。
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

网站推广
关于我们
  • 台州维博网络(Tzweb.com)拥有多年开发网站平台系统门户手机客户端等业务的成功经验。主要从事:企业网站建设、网站程序开发、手机APP客户端、平面设计、主机域名、虚拟空间、网站推广、网站优化、后期维护等服务,满足不同企业公司的需求,是台州地区领先的网络技术服务商!

Hi,扫描关注我

Copyright © 2005-2018 站长论坛 All rights reserved

Powered by 站长论坛 with TZWEB Update Techonolgy Support

快速回复 返回顶部 返回列表