在使用GNU编译器进行编译期间,在Linux中更改C ++应用程序的堆栈大小
在使用g++
进行C ++程序编译的OSX中
LD_FLAGS= -Wl,-stack_size,0x100000000
但在SUSE Linux中,我经常会遇到如下错误:
x86_64-suse-linux/bin/ld: unrecognized option '--stack'
和类似的。
我知道这是可以使用的
ulimit -s unlimited
但是这并不好,因为一个用户不会总是这么做。
如何在单个应用程序中使用GCC增加Linux的堆栈大小?
你可以用setrlimit以编程方式设置堆栈大小,例如
#include <sys/resource.h> int main (int argc, char **argv) { const rlim_t kStackSize = 16 * 1024 * 1024; // min stack size = 16 MB struct rlimit rl; int result; result = getrlimit(RLIMIT_STACK, &rl); if (result == 0) { if (rl.rlim_cur < kStackSize) { rl.rlim_cur = kStackSize; result = setrlimit(RLIMIT_STACK, &rl); if (result != 0) { fprintf(stderr, "setrlimit returned result = %d\n", result); } } } // ... return 0; }
注意:即使使用这种方法来增加堆栈大小,也不应该在main()
本身中声明大的局部变量,因为在getrlimit
/ setrlimit
代码出现之前,只要输入main()
就可能发生堆栈溢出改变堆栈大小的机会。 因此,任何大的局部变量只能在函数中定义,这些函数在成功增加堆栈大小之后,将从main()
调用。
而不是stack_size
,使用--stack
像这样:
gcc -Wl,--stack,4194304 -o program program.c
这个例子应该给你4 MB的堆栈空间。 在MinGW的GCC上工作,但正如手册中所说:“这个选项是特定于连接器的i386 PE目标端口”(即仅用于输出Windows二进制文件)。 似乎没有ELF二进制文件的选项。
使用ulimit bash内建值或setrlimit()或使用PAM登录(pam_limits.so)来更改它。
这是一个可设置的用户资源限制; 请参阅selimlimit(2)中的RLIMIT_STACK。
http://bytes.com/topic/c/answers/221976-enlarge-stack-size-gcc
考虑使用-fsplit-stack
选项https://gcc.gnu.org/wiki/SplitStacks