Изменение размера стека для приложения 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 для одного приложения?
5 ответов
Вы можете установить размер стека программно с помощью 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()
после того, как размер стека был успешно увеличен.
Вместо stack_size
использовать --stack
вот так:
gcc -Wl,--stack,4194304 -o program program.c
Этот пример должен дать вам 4 МБ стекового пространства. Работает на GCC MinGW, но, как говорится на man-странице: "Эта опция специфична для целевого порта компоновщика i386 PE" (т.е. работает только для вывода двоичных файлов Windows). Похоже, что нет опции для бинарных файлов ELF.
Это старая тема, но ни один из флагов, на которые я здесь ответил, не работал у меня. Во всяком случае, я обнаружил, что -Wl,-z,stack-size=4194304 (пример для 4 МБ), похоже, работает.
Рассмотреть возможность использования -fsplit-stack
опция https://gcc.gnu.org/wiki/SplitStacks
Измените его с помощью встроенной функции ulimit bash, или setrlimit(), или при входе через PAM (pam_limits.so).
Это устанавливаемый лимит пользовательских ресурсов; смотрите RLIMIT_STACK в setrlimit (2).
http://bytes.com/topic/c/answers/221976-enlarge-stack-size-gcc