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

问题描述 投票:0回答:5

在 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 中单个应用程序的堆栈大小?

c++ gcc gnu stack-size
5个回答
82
投票

您可以使用 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()
调用的函数中定义。


26
投票

不要使用

stack_size
,而是使用
--stack
,如下所示:

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

此示例应为您提供 4 MB 的堆栈空间。适用于 MinGW 的 GCC,但正如联机帮助页所述,“此选项特定于链接器的 i386 PE 目标端口”(即仅适用于输出 Windows 二进制文件)。似乎没有 ELF 二进制文件的选项。


13
投票

这是一个老话题,但这里回答的所有标志都不适合我。无论如何,我发现

-Wl,-z,stack-size=4194304
(4MB 的示例)似乎有效。


7
投票

考虑使用

-fsplit-stack
选项 https://gcc.gnu.org/wiki/SplitStacks


2
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.