web-dev-qa-db-fra.com

Changer la taille de la pile pour une application C ++ sous Linux lors de la compilation avec le compilateur GNU

Dans OSX lors de la compilation du programme C++ avec g++ J'utilise

LD_FLAGS= -Wl,-stack_size,0x100000000

mais dans SUSE Linux, je reçois constamment des erreurs comme:

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

et similaire.

Je sais qu'il est possible d'utiliser

ulimit -s unlimited

mais ce n'est pas agréable, car un seul utilisateur ne peut pas toujours le faire.

Comment puis-je augmenter la taille de la pile sous Linux avec GCC pour une seule application?

41
asdf

Vous pouvez définir la taille de la pile par programme avec setrlimit , par ex.

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

Remarque: même lorsque vous utilisez cette méthode pour augmenter la taille de la pile, vous ne devez pas déclarer de grandes variables locales dans main() lui-même, car vous risquez d'obtenir un débordement de pile dès que vous entrez main(), avant le code getrlimit/setrlimit a eu la possibilité de modifier la taille de la pile. Toutes les grandes variables locales doivent donc être définies uniquement dans les fonctions qui sont ensuite appelées à partir de main(), une fois la taille de la pile correctement augmentée.

56
Paul R

Au lieu de stack_size, utilisation --stack ainsi:

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

Cet exemple devrait vous donner 4 Mo d'espace de pile. Fonctionne sur le GCC de MinGW, mais comme le dit la page de manuel, "Cette option est spécifique au port ciblé i386 PE de l'éditeur de liens" (c'est-à-dire ne fonctionne que pour la sortie des binaires Windows). Il semble qu'il n'y ait pas d'option pour les binaires ELF.

14
AndiDog

Pensez à utiliser -fsplit-stack option https://gcc.gnu.org/wiki/SplitStacks

2
Sergei

Modifiez-le avec le module intégré ulimit bash, ou setrlimit (), ou lors de la connexion avec PAM (pam_limits.so).

Il s'agit d'une limite de ressources utilisateur réglable; voir RLIMIT_STACK dans setrlimit (2).

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

1
f0ster