在OSX上,使用g++
编译C++程序时,我使用
LD_FLAGS= -Wl,-stack_size,0x100000000
但在SUSE Linux中,我经常会遇到以下错误:
x86_64-suse-linux/bin/ld: unrecognized option '--stack'
以及类似的功能。
我知道可以使用
ulimit -s unlimited
但这种方式并不好,因为并非每个用户都能这样做。
我如何在Linux中使用GCC为单个应用程序增加堆栈大小?
你可以使用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()
调用的函数中,在成功增加堆栈大小之后。
main()
函数中声明一个大的局部变量?这当然行不通,因为在你甚至到达getrlimit
/setrlimit
代码之前,就会出现堆栈溢出。将大的局部变量放在另一个函数中,然后从main
中调用此函数(在getrlimit
/setrlimit
代码之后)。 - Paul Rmain()
中尝试了一下,但是在我设置新限制之后才进行的。显然这样行不通。当我从main()
调用一个有巨大本地变量的函数时,它就可以工作了。我现在使用不同的限制进行了检查,所有都完美地工作了。结论:堆栈限制必须在main()
中设置,以便在程序的其余部分中生效。我还必须关闭ssh
会话,因为我正在玩ulimit -s
,并且我总是得到-1作为返回代码。 - Peter VARGA不要使用 stack_size
,而是使用如下方式的 --stack
:
gcc -Wl,--stack,4194304 -o program program.c
这个示例应该会给你 4MB 的堆栈空间。在MinGW的GCC上工作正常,但正如manpage所说,“此选项专为链接器针对i386 PE目标端口而设计”(即仅适用于输出Windows二进制文件)。看起来对于ELF二进制文件没有类似的选项。
这是一个古老的话题,但这里列出的所有标志都对我没有用。无论如何,我发现-Wl,-z,stack-size=4194304
(例如4MB)似乎有效。
考虑使用-fsplit-stack
选项。https://gcc.gnu.org/wiki/SplitStacks
-fsplit-stack
对我的使用情况造成了约20%的性能下降。 - Dennis可以使用ulimit bash内置命令、setrlimit()函数或PAM(pam_limits.so)在登录时进行更改。
这是一个可设置的用户资源限制;请参见setrlimit(2)中的RLIMIT_STACK。
http://bytes.com/topic/c/answers/221976-enlarge-stack-size-gcc
setrlimit
函数。这个函数可以被用来设定资源限制。请注意,这里需要在程序开头进行设置,而不是在系统级别上进行更改。 - F'x
rlimit_stack
可能会导致失败或相关问题。还请参阅Red Hat Issue 1463241。 - jwwld -v
,请。 - Sergei Krivonos