57

在 C++ 程序编译期间的 OSX 中,g++我使用

LD_FLAGS= -Wl,-stack_size,0x100000000

但在 SUSE Linux 中,我经常遇到以下错误:

x86_64-suse-linux/bin/ld: unrecognized option '--stack'

和类似的。

我知道可以使用

ulimit -s unlimited

但这并不好,因为单个用户并不总是可以做到这一点。

如何使用 GCC 为单个应用程序增加 Linux 中的堆栈大小?

4

5 回答 5

72

您可以使用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()getrlimitsetrlimitmain()

于 2010-02-17T21:55:09.187 回答
20

而不是stack_size,--stack像这样使用:

gcc -Wl,--stack,4194304 -o program program.c

这个例子应该给你 4 MB 的堆栈空间。适用于 MinGW 的 GCC,但正如手册页所述,“此选项特定于链接器的 i386 PE 目标端口”(即仅适用于输出 Windows 二进制文件)。似乎没有 ELF 二进制文件的选项。

于 2010-02-16T19:12:10.670 回答
6

这是一个老话题,但这里回答的所有标志都不适合我。无论如何,我发现-Wl,-z,stack-size=4194304(例如 4MB)似乎有效。

于 2021-01-15T09:36:38.293 回答
5

考虑使用-fsplit-stack选项https://gcc.gnu.org/wiki/SplitStacks

于 2017-03-21T10:29:20.663 回答
2

使用 ulimit bash 内置函数或 setrlimit() 或在登录时使用 PAM (pam_limits.so) 更改它。

这是一个可设置的用户资源限制;请参阅 setrlimit(2) 中的 RLIMIT_STACK。

http://bytes.com/topic/c/answers/221976-enlarge-stack-size-gcc

于 2010-02-16T19:14:09.267 回答