大佬教程收集整理的这篇文章主要介绍了使用setrlimit()设置堆栈大小,并引发堆栈溢出/ segfault,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
为什么现在可以在foo()中的大小为8kb的堆栈上分配一个int数组?
#include <stdio.h> #include <sys/resource.h> void foo(void); int main() { struct rlimit lim = {1024,1024}; if (setrlimit(RLIMIT_STACK,&lim) == -1) return 1; foo(); return 0; } void foo() { unsigned ints[2048]; printf("foo: %u\n",ints[2047]=42); }
显然,堆栈的初始大小是文件名env Strings 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 Molnar的exec-shield补丁(Fedora,Ubuntu,…)的内核还有一个额外的EXEC_STACK_BIAS(“2MB以上的随机化效果”),请参见从acct_stack_growth()调用新函数over_stack_limit() [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 $
以上是大佬教程为你收集整理的使用setrlimit()设置堆栈大小,并引发堆栈溢出/ segfault全部内容,希望文章能够帮你解决使用setrlimit()设置堆栈大小,并引发堆栈溢出/ segfault所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。