假设我有一个正在运行的程序,我在BSD(或 / proc / [pid] / maps )中查看 / proc / [pid] / map linux),我会看到一行如下:
0xbfbe0000 0xbfc00000 3 0 0xc74c4198 rwx 1 0 0x3000 COW NNC default - CH 1001
这是堆栈。我所有的PC-BSD程序都使用相同的堆栈边界0xbfc00000。在Linux上,关闭ASLR,会发生类似的事情。
我想在某些程序中使用这些设置,但堆栈似乎甚至没有在elf程序标题或节标题中指定。
因此,如果我想更改设置,例如:
有没有办法改变单个程序的“堆栈设置”? 系统范围怎么样?
答案 0 :(得分:1)
对于FreeBSD:
在amd64,i386和powerpc上,您可以使用sysctls kern.elf32.nxstack
和kern.elf64.nxstack
控制堆栈是否可执行(自FreeBSD 9.0起)。
您可以使用limits(1)
启动具有不同堆栈大小的程序,或使用login.conf(5)
为不同类别的用户设置限制。堆栈边界在内核中看起来是硬编码的。请参阅sv_usrstack
的字段struct sysentvec
以了解您的架构。
修改强>
您的程序可以使用setrlimit(2)
请求更大的最大堆栈大小。
GNU链接器支持--stack
选项,但是根据手册页;
此选项特定于i386 PE目标端口 链接器
所以这只适用于Windows。