1

假设我有一个正在运行的程序,我查看BSD中的/proc/[pid]/map (或 linux 中的/proc/[pid]/maps),我会看到如下一行:

0xbfbe0000 0xbfc00000 3 0 0xc74c4198 rwx 1 0 0x3000 COW NNC default - CH 1001

这是堆栈。我所有的 PC-BSD 程序都使用相同的堆栈边界 0xbfc00000。在 Linux 上,关闭 ASLR 后,也会发生类似的事情。

我想在某些程序上使用这些设置,但堆栈似乎甚至没有在 elf 程序头或节头中指定。

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

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

有没有办法更改单个程序的“堆栈设置”?系统范围如何?

4

1 回答 1

1

对于 FreeBSD:

在 amd64、i386 和 powerpc 上,您可以控制堆栈是否可以使用 sysctlskern.elf32.nxstackkern.elf64.nxstack(从 FreeBSD 9.0 开始)执行。

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

编辑 您的程序可以通过使用请求更大的最大堆栈大小setrlimit(2)

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

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

所以这只适用于Windows。

于 2012-08-12T23:14:46.000 回答