我使用的是32位x86 Ubuntu桌面。我查看了/proc/[pid]/mmaps,发现堆栈基址总是在更改(例如,在以下情况下为0xbfe76000)。因此,我猜测内核(或ELF加载程序)必须在每次进程启动时随机化堆栈位置。
我想知道栈基地址随机化的确切代码(在内核或ELF加载程序中)是什么/在哪里。因为我想分配(例如通过mmap)0xC0000000正下方的几页,我只是不确定堆栈是否有可能位于0xbffff000。非常感谢。
... ...
b7762000-b7763000 rw-p 00020000 fc:00 1188263 /lib/i386-linux-gnu/ld-2.19.so
bfe55000-bfe76000 rw-p 00000000 00:00 0 [stack]
这不是一个直接的答案(ASLR机制在不同的内核版本中略有发展)。最近的4.6内核出现了几个aslr
字符串。
但对于您的问题,您可以简单地通过/proc/self/maps
查询内核以找到堆栈段,然后使用MAP_FIXED
标志到mmap
来映射这些段之外的内容。