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

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

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

2016-08-04 14:07:50|  分类: C++(VC)编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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

 

 

《程序员的自我修养》《加密与解密》等书籍

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

http://blog.csdn.net/zp373860147/article/details/7815925

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

LINUX上和WINDOWS上,编译后的可执行文件的格式,一个是ELF,一个是PE格式。二者不管是什么格式,有什么不同,最终都得映射到内存中才会执行。那么就出现了一个问题,可执行文件是如何映射到内存中去的呢?他们在内存的映射的片段是如何的分配的呢?

下面先看一下PE的文件格式:

 

编译链接和加载分析之二编译后的目标文件到内存的映射(WIN可执行文件的加载过程) - 还东国 - 还东国的博客

 

大家都知道,在进程中对内存的分配是分为以下几个部分的:

代码节:包含供CPU执行的机器指令,.text

数据节:包含供CPU使用的数据。通常分为已初始化的数据(.data)未初始化的数据(.bss)和只读的数据(.rdata.

堆:不展开讲。

栈:同上。

最上层部分为内核区域,供特定进程的环境变量使用。

不过大家要明白,内存中是没有这个节那个节的,是从程序文件中映射过来的,这样理解会更清楚一些。

下面看他们是如何映射到内存中去的,看下面的图:

编译链接和加载分析之二编译后的目标文件到内存的映射(WIN可执行文件的加载过程) - 还东国 - 还东国的博客

 

 

 

编译链接和加载分析之二编译后的目标文件到内存的映射(WIN可执行文件的加载过程) - 还东国 - 还东国的博客

 

这里涉及到了一个问题,就是区块对齐的问题,这个在加密与解密这本书上和许多涉及到病毒木马的的资料都讲,就是说因为磁盘文件和内存的特性的不同,导致实际上节之间的间隙是不同的。在32位上内存一般是1000h64位内存上一般是2000h,但是在磁盘为了缩小PE文件的大小,其对齐有的是200h。详细的查看相关书籍。

编译链接和加载分析之二编译后的目标文件到内存的映射(WIN可执行文件的加载过程) - 还东国 - 还东国的博客

 

另外,在从可执行文件向内存映射进程执行的过程中,一些节是不映射的,比如一些描述可执行文件属性的节.reloc重定位段等。

磁盘映像, 内存映像, 地址空间之比较

http://www.360doc.com/content/14/0628/15/7821691_390508751.shtml

可执行程序首先被操作系统从磁盘中拷贝到内存中, 还要为进程分配地址空间. 加上已经介绍的内存程序映像, 这就有三种关于可执行程序的存储组织了:

磁盘: 可执行文件段    内存: 内存程序映像  进程: 进程地址空间

下标列出了它们之间的对应关系:

 内存程序映像

进程地址空间

可执行文件段

 code(text)

code(text) 

 code(text)

 data

 data

data 

bss  

 data

 bss

 heap

data 

stack 

stack 

 

内存程序映像和进程地址空间之比较

 

(1) 它们的代码段和栈相互对应.

(2) 内存程序映像的data, bss, heap对应到进程地址空间的data. 也就是说, data, bss, heap会位于一个连续的地址空间中, codestack可能位于另外的地址空间. 这就可以针对不同的段实现不同的内存管理策略: code段所在的地址空间可以是"只能被执行的", data, bss, heap所在的地址空间是不可执行的...

 

正因为内存程序映像中的各段可能位于不同的地址空间中, 它们不一定位于连续的内存块中. 操作系统将程序映像映射到地址空间时, 通常将内存程序映像划分为大小相同的块(也就是page, ). 只有该页被引用时, 它才被加载到内存中. 不过对于程序员来说, 可以视内存程序映像在逻辑上是连续的.

 

内存程序映像和可执行文件段之比较

(1) 明显, 前者位于内存中, 后者位于磁盘中.

(2) 内存程序映像中的code, data, bss段分别对应于可执行文件段中的code, data, bss.

(3) 堆栈在可执行文件段中是没有的, 因为只有程序被加载到内存中运行时才会被分配堆栈.

(4) 虽然可执行文件段中包含了bss, bss并不被储存在位于磁盘中的可执行文件中.

使用file, ls, size, strip命令来查看相关信息

现在终于明白了可执行文件到进程转换的过程了吧。要有三个部分,从硬盘的代码拷贝到内存映像,然后再分配相关的资源,形成进程。

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

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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