Подтвердить что ты не робот

Изменение размера стека для приложения С++ в Linux во время компиляции с компилятором GNU

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

LD_FLAGS= -Wl,-stack_size,0x100000000

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

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

и тому подобное.

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

ulimit -s unlimited

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

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

4b9b3361

Ответ 1

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

Ответ 2

Вместо stack_size используйте --stack следующим образом:

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

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

Ответ 4

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

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

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