在 OSX 中,在使用
g++
编译 C++ 程序期间,我使用
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()
本身中声明大型局部变量,因为一旦您进入 main()
,在 getrlimit
/setrlimit
之前,您很可能会遇到堆栈溢出
代码有机会更改堆栈大小。因此,任何大型局部变量都应该仅在堆栈大小成功增加后随后从 main()
调用的函数中定义。
不要使用
stack_size
,而是使用 --stack
,如下所示:
gcc -Wl,--stack,4194304 -o program program.c
此示例应为您提供 4 MB 的堆栈空间。适用于 MinGW 的 GCC,但正如联机帮助页所述,“此选项特定于链接器的 i386 PE 目标端口”(即仅适用于输出 Windows 二进制文件)。似乎没有 ELF 二进制文件的选项。
这是一个老话题,但这里回答的所有标志都不适合我。无论如何,我发现
-Wl,-z,stack-size=4194304
(4MB 的示例)似乎有效。
使用 ulimit bash 内置函数或 setrlimit() 或在登录时更改它 使用 PAM (pam_limits.so)。
这是一个可设置的 用户资源限制;请参阅 setrlimit(2) 中的 RLIMIT_STACK。
http://bytes.com/topic/c/answers/221976-enlarge-stack-size-gcc