如何在BSD或Linux中控制程序的默认堆栈设置?

时间:2012-07-25 08:07:14

标签: linux stack freebsd memory-model

假设我有一个正在运行的程序,我在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程序标题或节标题中指定。

因此,如果我想更改设置,例如:

  • 更改堆栈的执行权限
  • 将堆栈边界设置为另一个值

有没有办法改变单个程序的“堆栈设置”? 系统范围怎么样?

1 个答案:

答案 0 :(得分:1)

对于FreeBSD:

在amd64,i386和powerpc上,您可以使用sysctls kern.elf32.nxstackkern.elf64.nxstack控制堆栈是否可执行(自FreeBSD 9.0起)。

您可以使用limits(1)启动具有不同堆栈大小的程序,或使用login.conf(5)为不同类别的用户设置限制。堆栈边界在内核中看起来是硬编码的。请参阅sv_usrstack的字段struct sysentvec以了解您的架构。

修改 您的程序可以使用setrlimit(2)请求更大的最大堆栈大小。

GNU链接器支持--stack选项,但是根据手册页;

  

此选项特定于i386 PE目标端口              链接器

所以这只适用于Windows。