注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

编译链接和加载分析之三编译后的目标文件到内存的映射(LINUX可执行文件的加载过程)  

2016-08-04 17:10:57|  分类: C++(VC)编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

编译链接和加载分析之三编译后的目标文件到内存的映射(LINUX可执行文件的加载过程)

 

上面讲过了在Win下的加载过程,其实这两个本来想写一个来,但是发现一些图片和内容很容易引起误导,所以最终还是拆分开来讲。这样可以让大家更清晰明白的弄清楚有什么不同。

 

2016年08月04日 - 还东国 - 还东国的博客

 

上面的Senction其实就是.bss .data啥的。大家明白,这里就不展开,在上一篇博客里讲得非常多了。

http://jzhihui.iteye.com/blog/1447570

http://blog.sina.com.cn/s/blog_4ed962ae01013vhr.html

http://www.cnblogs.com/L20135304/p/5375698.html

 

ELF的数据编码与机器相关,一共有六种情形,具体见下表:

2016年08月04日 - 还东国 - 还东国的博客

 

可执行文件中,一个program header描述的内容称为一个段(segment)。Segment包含一个或者多个section.

2016年08月04日 - 还东国 - 还东国的博客

 

1、可执行程序的产生:

C语言代码-->编译器预处理-->编译成汇编代码-->汇编器编译成目标代码-->链接成可执行文件,再由操作系统加载到内存中执行。

2ELF格式中主要有3种可执行文件:可重定位文件.o,可执行文件,共享目标文件。

3ELF可执行文件会被默认映射到0x8048000这个地址。

4、命令行参数和环境变量是如何进入新程序的堆栈的?

Shell程序-->execve-->sys_execve,然后在初始化新程序堆栈时拷贝进去。

先函数调用参数传递,再系统调用参数传递。

5、当前程序执行到execve系统调用时陷入内核态,在内核中用execve加载可执行文件,把当前进程的可执行文件覆盖掉,execve系统调用返回到新的可执行程序的起点。

6、动态链接库的装载过程是一个图的遍历过程,

ELF格式中的.interp.dynamic需要依赖动态链接器来解析,entry返回到用户态时不是返回到可执行程序规定的起点,返回到动态链接器的程序入口

看一下别人总结的ELF加载的过程:

1. 内核首先读取ELF文件头部,再读如各种数据结构,从这些数据结构中可知各段或节的地址及标识,然后调用mmap()把找到的可加载段的内容加载到内存中。同时读取段标记,以标识该段在内存中是否可读、可写、可执行。其中,文本段是程序代码,只读且可执行,而数据段是可读且可写。

2. PT_INTERP的段中找到所对应的动态链接器名称,并加载动态链接器。通常是/lib/ld-linux.so.2.

3. 内核把新进程的堆栈中设置一些标记对,以指示动态链接器的相关操作。

4. 内核把控制权传递给动态链接器。

5. 动态链接器检查程序对共享库的依赖性,并在需要时对其进行加载。

6. 动态链接器对程序的外部引用进行重定位,并告诉程序其引用的外部变量/函数的地址,此地址位于共享库被加载在内存的区间内。动态链接还有一个延迟定位的特性,即只有在“真正”需要引用符号时才重定位,这对提高程序运行效率有极大帮助。

7. 动态链接器执行在ELF文件中标记为.init的节的代码,进行程序运行的初始化。

8. 动态链接器把控制传递给程序,从ELF文件头部中定义的程序进入点(main)开始执行。在a.out格式和ELF格式中,程序进入点的值是显式存在的,而在COFF格式中则是由规范隐含定义。

9. 程序开始执行.

需要说明的是:动态库有时候是在内核加载的有时候儿是应用程序加载的。差不多。

其实还有很多东西需要总结,等下面一一来做吧,忽然觉得写不下去了。回头再接着写。

  评论这张
 
阅读(71)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017