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

asd*_*sdf 43 gcc gnu

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

LD_FLAGS= -Wl,-stack_size,0x100000000
Run Code Online (Sandbox Code Playgroud)

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

x86_64-suse-linux/bin/ld: unrecognized option '--stack'
Run Code Online (Sandbox Code Playgroud)

和类似的.

我知道可以使用

ulimit -s unlimited
Run Code Online (Sandbox Code Playgroud)

但这并不好,因为单个用户并不总能做到这一点.

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

Pau*_*l R 58

您可以使用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;
}
Run Code Online (Sandbox Code Playgroud)

注意:即使使用此方法来增加堆栈大小,也不应该在main()其自身中声明大的局部变量,因为main()getrlimit/ setrlimitcode有机会更改堆栈大小之前,您可能会在输入后立即获得堆栈溢出.因此,只有在main()成功增加堆栈大小后,才能在随后调用的函数中定义任何大的局部变量.


And*_*Dog 14

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

gcc -Wl,--stack,4194304 -o program program.c
Run Code Online (Sandbox Code Playgroud)

这个例子应该给你4 MB的堆栈空间.适用于MinGW的GCC,但正如联机帮助页所述,"此选项特定于链接器的i386 PE目标端口"(即仅适用于输出Windows二进制文件).好像ELF二进制文件没有选项.

  • 好吧,你救了我.我在窗户上;).谢谢! (3认同)
  • 不幸的是,我尝试了此操作,但它不起作用:/usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../x86_64-suse-linux/bin/ld:无法识别选项'--stack'/usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../x86_64-suse-linux/bin/ld:使用--help使用信息collect2的选项:ld返回1退出状态 (2认同)

小智 13

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


Ser*_*gei 5

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

  • `-fsplit-stack` 在我的用例中将性能降低了约 20%。 (3认同)
  • @Dennis,您好,请考虑将此性能与堆的使用进行比较。 (2认同)