猿问

在用GNU编译器编译时更改Linux中C+应用程序的堆栈大小

在用GNU编译器编译时更改Linux中C+应用程序的堆栈大小

在OSX中,在C+程序编译过程中使用g++我用

LD_FLAGS= -Wl,-stack_size,0x100000000

但是在SUSE Linux中,我经常会遇到这样的错误:

x86_64-suse-linux/bin/ld: unrecognized option '--stack'

和类似的。

我知道可以用

ulimit -s unlimited

但是这并不是很好,因为单个用户并不总是能做到这一点。

如何在Linux中为单个应用程序增加堆栈大小?


慕桂英546537
浏览 1885回答 3
3回答

LEATH

可以编程方式将堆栈大小设置为七限,G.#include&nbsp;<sys/resource.h>int&nbsp;main&nbsp;(int&nbsp;argc,&nbsp;char&nbsp;**argv){ &nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;rlim_t&nbsp;kStackSize&nbsp;=&nbsp;16&nbsp;*&nbsp;1024&nbsp;*&nbsp;1024;&nbsp;&nbsp;&nbsp;//&nbsp;min&nbsp;stack&nbsp;size&nbsp;=&nbsp;16&nbsp;MB &nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;rlimit&nbsp;rl; &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;result; &nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;getrlimit(RLIMIT_STACK,&nbsp;&rl); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(result&nbsp;==&nbsp;0) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(rl.rlim_cur&nbsp;<&nbsp;kStackSize) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rl.rlim_cur&nbsp;=&nbsp;kStackSize; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;setrlimit(RLIMIT_STACK,&nbsp;&rl); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(result&nbsp;!=&nbsp;0) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;"setrlimit&nbsp;returned&nbsp;result&nbsp;=&nbsp;%d\n",&nbsp;result); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;... &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}注意:即使使用此方法来增加堆栈大小,也不应该在main()本身,因为您很可能在输入时立即得到堆栈溢出。main(),在getrlimit/setrlimit代码有机会更改堆栈大小。因此,任何大型局部变量都应该只在随后被调用的函数中定义。main(),在成功地增加堆栈大小之后。

缥缈止盈

而不是stack_size,使用--stack就像这样:gcc&nbsp;-Wl,--stack,4194304&nbsp;-o&nbsp;program&nbsp;program.c这个例子应该给你4MB的堆栈空间。工作在MinGW的GCC,但如手册所述,“此选项是特定于i 386 PE目标端口的链接器”(即只用于输出Windows二进制文件)。看来ELF二进制文件没有选择。
随时随地看视频慕课网APP
我要回答