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

В 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 для отдельного приложения?

43
задан Palec 28 October 2014 в 16:59
поделиться

3 ответа

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

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

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

14
ответ дан 26 November 2019 в 22:55
поделиться

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

58
ответ дан 26 November 2019 в 22:55
поделиться

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

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

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

1
ответ дан 26 November 2019 в 22:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: