概括分析elf加载过程
匿名用户:
load_elf_binary(linux_binprm* bprm,pt_regs* regs)
分析 ELF 文件头
读入程序的头部分( kernel_read 函数)
if (存在解释器头部) {
读入解释器名( ld*.so ) (kernel_read 函数 ) | ( zalem note :可用
打开解释器文件( open_exec 函数) | objdump -s -j .interp xxx
读入解释器文件的头部( kernel_read 函数) | 命令查看,
) |linux 下是 /lib/ld-linux.so.x )
释放空间,清楚信号,关闭指定了 close-on-exec 标识的文件( flush_old_exec 函数)
生成堆栈空间,塞入环境变量 / 参数部分( setup_arg_pages 函数)
for (可引导的所有的程序头) {
将文件影射入内存空间( elf_map,do_mmap 函数)
}
if (为动态联结) {
影射动态联结器( load_elf_interp 函数)
}
释放文件( sys_close 函数)
确定执行中的 UID , GID ( compute_creds 函数)
生成 bss 领域( set_brk 函数)
bss 领域清零( padzero 函数)
设定从 exec 返回时的 IP , SP ( start_thread 函数)(动态联结时的 IP 指向解释器的入口)
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ruixj/archive/2009/11/07/47
|