Alterar o tamanho da pilha para um aplicativo C ++ no Linux durante a compilation com o compilador GNU

No OSX durante a compilation do programa C ++ com g++ eu uso

 LD_FLAGS= -Wl,-stack_size,0x100000000 

mas no SUSE Linux eu constantemente recebo erros como:

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

e similar.

Eu sei que é possível usar

 ulimit -s unlimited 

mas isso não é bom, nem sempre um único usuário pode fazer isso.

Como posso aumentar o tamanho da pilha no Linux com o GCC para um único aplicativo?

Você pode definir o tamanho da pilha programaticamente com setrlimit , por exemplo

 #include  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; } 

Nota: mesmo ao usar este método para aumentar o tamanho da pilha você não deve declarar grandes variables ​​locais no próprio main() , pois você pode obter um estouro de pilha assim que você entra main() , antes que o código setrlimit / setrlimit tenha chance de alterar o tamanho da pilha. Quaisquer variables ​​locais grandes devem, portanto, ser definidas apenas em funções que são subseqüentemente chamadas de main() , após o tamanho da pilha ter sido aumentado com sucesso.

Em vez de stack_size , use --stack assim:

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

Este exemplo deve dar a você 4 MB de espaço na pilha. Funciona no GCC do MinGW, mas como diz o manpage, “Esta opção é específica para a porta direcionada do vinculador i386 PE” (ou seja, funciona apenas para a saída de binários do Windows). Parece que não há uma opção para binários ELF.

Considere o uso -fsplit-stack opção -fsplit-stack https://gcc.gnu.org/wiki/SplitStacks

Altere-o com o ulimit bash builtin, ou setrlimit (), ou no login com o PAM (pam_limits.so).

É um limite de resources de usuário configurável; veja RLIMIT_STACK em setrlimit (2).

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

Intereting Posts