Изменение размера стека для приложения C ++ в Linux во время компиляции с помощью компилятора GNU - PullRequest
41 голосов
/ 16 февраля 2010

В OSX во время компиляции программы на C ++ с g++ я использую

LD_FLAGS= -Wl,-stack_size,0x100000000

но в SUSE Linux я постоянно получаю сообщения об ошибках типа:

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

и аналогичные.

Я знаю, что можно использовать

ulimit -s unlimited

но это нехорошо, поскольку не всегда один пользователь может это сделать.

Как я могу увеличить размер стека в Linux с помощью GCC для одного приложения?

Ответы [ 4 ]

56 голосов
/ 18 февраля 2010

Вы можете установить размер стека программно с помощью 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() после успешного увеличения размера стека.

14 голосов
/ 16 февраля 2010

Вместо stack_size используйте --stack примерно так:

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

Этот пример должен дать вам 4 МБ стекового пространства. Работает на GCC MinGW, но, как говорится на man-странице: «Эта опция специфична для целевого порта компоновщика i386 PE» (т.е. работает только для вывода двоичных файлов Windows). Похоже, для ELF-файлов нет опции.

2 голосов
/ 21 марта 2017

Рассмотрите возможность использования опции -fsplit-stack https://gcc.gnu.org/wiki/SplitStacks

1 голос
/ 16 февраля 2010

Измените его с помощью встроенной функции ulimit bash, или setrlimit (), или при входе в систему с помощью PAM (pam_limits.so).

Это устанавливаемое ограничение пользовательских ресурсов;см. RLIMIT_STACK в setrlimit (2).

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

...