ELF加载程序如何确定初始堆栈大小? 您所在的位置:网站首页 堆栈区域的大小是多少 ELF加载程序如何确定初始堆栈大小?

ELF加载程序如何确定初始堆栈大小?

2024-07-04 14:47| 来源: 网络整理| 查看: 265

我正在研究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 实验室设备网 版权所有