在使用GNU编译器编译期间,在Linux中更改C ++应用程序的堆栈大小

时间:2010-02-16 19:05:11

标签: gcc gnu

在使用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中的堆栈大小?

5 个答案:

答案 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