首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用GNU编译器进行编译期间更改C++应用程序的堆栈大小

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

Stack Overflow用户
提问于 2010-02-17 03:05:11
回答 5查看 96.1K关注 0票数 56

在用g++编译C++程序的过程中,我使用了

代码语言:javascript
复制
LD_FLAGS= -Wl,-stack_size,0x100000000

但在SUSE Linux中,我经常收到这样的错误:

代码语言:javascript
复制
x86_64-suse-linux/bin/ld: unrecognized option '--stack'

也很相似。

我知道这是可以使用的

代码语言:javascript
复制
ulimit -s unlimited

但这并不好,因为并不是每个用户都能做到这一点。

如何在Linux下用GCC增加单个应用的栈大小?

EN

回答 5

Stack Overflow用户

发布于 2010-02-18 05:55:09

您可以使用setrlimit以编程方式设置堆栈大小,例如

代码语言:javascript
复制
#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()本身中声明大的局部变量,因为在getrlimit/setrlimit代码有机会更改堆栈大小之前,一旦输入main(),就很可能会出现堆栈溢出。因此,在成功增加堆栈大小之后,应仅在随后从main()调用的函数中定义任何较大的局部变量。

票数 72
EN

Stack Overflow用户

发布于 2010-02-17 03:12:11

使用--stack代替stack_size,如下所示:

代码语言:javascript
复制
gcc -Wl,--stack,4194304 -o program program.c

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

票数 20
EN

Stack Overflow用户

发布于 2017-03-21 18:29:21

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2275550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档