ELF加载程序如何确定初始堆栈大小? | 您所在的位置:网站首页 › 堆栈区域的大小是多少 › ELF加载程序如何确定初始堆栈大小? |
我正在研究ELF规范(http://www.skyfree.org/linux/references/ELF_Format.pdf),对于程序加载过程,我不清楚的一点是堆栈是如何初始化的,初始页面大小是多少。下面是测试(在Ubuntux86-64上): ELF规范对于这个堆栈页最初是如何存在的或为什么存在几乎没有说明,但是我可以找到一些引用,这些引用说应该使用指向argc的SP来初始化堆栈,并在此之上使用argv、envp和辅助向量,我已经证实了这一点。但是在SP下面有多少空间?在我的系统中,SP下面有映射的0x1FF00字节,但这大概是从0x7ffffffff000的堆栈顶部开始计算,而在整个映射中有0x21000字节。是什么影响了这个数字? 我知道堆栈下面的页面是一个“保护页”,如果我写信给它,它就会自动成为可写的,并“向下增长”(想必是这样,简单的堆栈处理“只起作用”),但是如果我分配了一个巨大的堆栈帧,那么我可能会超过保护页和分段错误,所以我想确定在进程开始时已经正确地分配了多少空间。 编辑:一些更多的数据使我更加不确定到底发生了什么。试验结果如下: 在这里,我使用常量0x7fe000的不同值来查看发生了什么,对于这个值,是否有分段错误是不确定的。根据GDB,subq指令本身将扩展mmap的大小,这对我来说很神秘( linux如何知道我的寄存器中有什么?),但是这个程序通常会因为某种原因在退出时使GDB崩溃。它不可能是ASLR导致的不确定性,因为我没有使用GOT或任何PLT部分;可执行文件每次都在虚拟内存中的相同位置加载。这是PID或物理记忆出血的随机性吗?总之,我非常困惑有多少堆栈实际上可以用于随机访问,以及在更改RSP或写入“只是超出合法内存范围”的区域时请求了多少。 |
CopyRight 2018-2019 实验室设备网 版权所有 |