在使用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中的堆栈大小?
答案 0 :(得分:56)
您可以使用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()
本身中声明大型局部变量,因为在进入main()
之后,您可能会立即获得堆栈溢出。 getrlimit
/ setrlimit
代码有机会更改堆栈大小。因此,只有在成功增加堆栈大小后,才能在main()
中调用的函数中定义任何大的局部变量。
答案 1 :(得分:14)
而不是stack_size
,请使用--stack
,如下所示:
gcc -Wl,--stack,4194304 -o program program.c
此示例应该为您提供4 MB的堆栈空间。适用于MinGW的GCC,但正如联机帮助页所述,“此选项特定于链接器的i386 PE目标端口”(即仅适用于输出Windows二进制文件)。好像ELF二进制文件没有选项。
答案 2 :(得分:4)
这是一个古老的话题,但这里回答的所有标志都不适合我。无论如何,我发现 -Wl,-z,stack-size=4194304(4MB 的示例)似乎有效。
答案 3 :(得分:2)
考虑使用-fsplit-stack
选项https://gcc.gnu.org/wiki/SplitStacks
答案 4 :(得分:1)
使用ulimit bash builtin或setrlimit()或登录时更改它 使用PAM(pam_limits.so)。
这是一个可以设定的 用户资源限制;请参阅setrlimit(2)中的RLIMIT_STACK。
http://bytes.com/topic/c/answers/221976-enlarge-stack-size-gcc