限制会立即设置,但仅在尝试分配新堆栈或尝试增加现有堆栈时检查。内核源代码上的RLIMIT_STACK (或 LXR 标识符搜索)的 grep 应该告诉我们。
显然,堆栈的初始大小是文件名 + env 字符串 + arg 字符串以及分配的一些额外页面setup_arg_pages
(2.6.33 1 , 2中的 20 个页面,2.6.34 3上的 128 Kb )所需的任何内容。
总之:
initial stack size = MIN(size for filename + arg strings + env strings + extra pages, MAX(size for filename + arg strings + env strings, RLIMIT_STACK))
在哪里
size for filename + arg strings + env strings <= MAX(ARG_MAX(32 pages), RLIMIT_STACK/4)
此外,带有 Ingo Molnarexec-shield
补丁的内核(Fedora、Ubuntu、...)还有一个额外的 EXEC_STACK_BIAS “(多出 2MB 以涵盖随机化效果。)”,请参阅over_stack_limit()
来自acct_stack_growth()
( [Ubuntu1]、[Ubuntu2]、[ Ubuntu3])。
我已经编辑了原始程序以显示这一点:
#include <stdio.h>
#include <sys/resource.h>
void foo(void);
int main(int argc, char *argv[]) {
struct rlimit lim = {1, 1};
if (argc > 1 && argv[1][0] == '-' && argv[1][8]=='l') {
printf("limiting stack size\n");
if (setrlimit(RLIMIT_STACK, &lim) == -1) {
printf("rlimit failed\n");
return 1;
}
}
foo();
return 0;
}
void foo() {
unsigned ints[32768];
printf("foo: %u\n", ints[2047]=42);
}
结果是:
$./rl
foo: 42
$./rl -l
limiting stack size
Segmentation fault
$