在OSX C++程序编译期间g++
我使用
LD_FLAGS= -Wl,-stack_size,0x100000000
Run Code Online (Sandbox Code Playgroud)
但在SUSE Linux中,我经常遇到如下错误:
x86_64-suse-linux/bin/ld: unrecognized option '--stack'
Run Code Online (Sandbox Code Playgroud)
和类似的.
我知道可以使用
ulimit -s unlimited
Run Code Online (Sandbox Code Playgroud)
但这并不好,因为单个用户并不总能做到这一点.
如何在单个应用程序中使用GCC增加Linux中的堆栈大小?
Pau*_*l R 58
您可以使用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;
}
Run Code Online (Sandbox Code Playgroud)
注意:即使使用此方法来增加堆栈大小,也不应该在main()
其自身中声明大的局部变量,因为main()
在getrlimit
/ setrlimit
code有机会更改堆栈大小之前,您可能会在输入后立即获得堆栈溢出.因此,只有在main()
成功增加堆栈大小后,才能在随后调用的函数中定义任何大的局部变量.
And*_*Dog 14
而不是像这样stack_size
使用--stack
:
gcc -Wl,--stack,4194304 -o program program.c
Run Code Online (Sandbox Code Playgroud)
这个例子应该给你4 MB的堆栈空间.适用于MinGW的GCC,但正如联机帮助页所述,"此选项特定于链接器的i386 PE目标端口"(即仅适用于输出Windows二进制文件).好像ELF二进制文件没有选项.
考虑使用-fsplit-stack
选项https://gcc.gnu.org/wiki/SplitStacks