博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux内核分析07
阅读量:5098 次
发布时间:2019-06-13

本文共 950 字,大约阅读时间需要 3 分钟。

可执行程序的装载

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

可执行程序是怎么来的?

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

 

转载于:https://www.cnblogs.com/KG35/p/5358278.html

你可能感兴趣的文章
03.makefile(上)
查看>>
软工个人总结
查看>>
如何将u盘、移动硬盘转化为活动分区--绝招
查看>>
MYSQL 5.7 修改密码、登录问题
查看>>
linux 同步时间 调试core内核
查看>>
PAT Basic 1085
查看>>
ios app真正的相互!!调用
查看>>
B-tree
查看>>
springMVC传递一组对象的接受方式
查看>>
收藏一个虚函数表以及虚表指针介绍的文章
查看>>
POJ---2492 A Bug's Life[并查集]
查看>>
[BZOJ1195] [HNOI2006]最短母串
查看>>
final阶段140字评论
查看>>
zookeeper集群搭建
查看>>
Jenkins-在windows上配置自动化部署(Jenkins+Gitblit)
查看>>
ng-if可见
查看>>
[AGC003]E - Sequential operations on Sequence
查看>>
Effective JAVA 思维导图
查看>>
【转】mysqldump
查看>>
Python Matplotlib作图指南
查看>>