首页 新闻 搜索 专区 学院

可执行文件的内存布局

0
[已关闭问题] 关闭于 2012-04-17 09:58

这是StackOverFlow上的一个问题,和我想的差不多,没具体测试过这些东西,所以拿出来小讨论一下:

The following question is a head-scratcher for me. Assuming that I have two platforms with an identical hardware, the same OS and the same compiler on it. If I compile exactly the same application, can I be sure that the memory layout on both machines will exactly be the same? In other words, both applications have exaclty the same virtual address space or is there a high chance that this is not the case.

目标平台:linux和mac os

问题描述:完全相同的系统版本和硬件设备,一个可执行文件的内存布局是否相同,可能会引入映像基址,堆,栈等的随机化,但是对于某些变量的相对偏移地址是否是相同的的呢?

zsounder的主页 zsounder | 老鸟四级 | 园豆:2819
提问于:2012-04-13 13:19
< >
分享
所有回答(2)
0

太高深了,帮你顶。你不 如亲自试试啊。用 debug 命令看看,debug XX.exe 

会长 | 园豆:9071 (大侠五级) | 2012-04-13 17:42
0

简单的总结一下吧,答案是NO.

几个平台下的内管管理方式有所差异,不过也是大同小异,在这里有两篇小结:

[os] 内存中的程序剖析 Anatomy of a Program in Memory

[os] Kernel是如何管理你的内存 How The Kernel Manages Your Memory

另一个问题就是ASLR机制了,现在几乎所有的系统中都引入了这个机制做映像,堆,栈或者数据的地址随机,在osx和ios上甚至已经将data段基址进行了一个地址随机,linux等似乎还没有做这一点,但是这些随机性也受到编译可执行文件时候的PIE影响。对于变量的相对偏移地址,在一个小的范围内,其偏移地址的确时相同的,例如C++的一个对象的内存布局,由同一个编译器编译得到的内存布局是相同的,其中的数据成员的相对偏移地址是固定的,但是相对于堆基址的偏移还是受到对象的地址的影响,这个地址是有随机性的。

zsounder | 园豆:2819 (老鸟四级) | 2012-04-16 03:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册