Změna velikosti zásobníku pro C ++ aplikací v systému Linux v průběhu kompilace s kompilátorem GNU

hlasů
36

V OSX během C ++ Program kompilace s g++používám

LD_FLAGS= -Wl,-stack_size,0x100000000

ale v systému SUSE Linux I neustále dostat chyby, jako jsou:

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

a podobné.

Já vím, že je možné použít

ulimit -s unlimited

ale to není hezké, jak ne vždy může jeden uživatel udělat.

Jak mohu zvýšit velikost zásobníku v Linuxu s GCC pro jednu aplikaci?

Položena 16/02/2010 v 20:05
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
53

Můžete nastavit velikost zásobníku programově s setrlimit , např

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

Poznámka: I při použití této metody pro zvýšení velikost zásobníku, neměli byste prohlásit velké lokální proměnné v main()sobě, protože můžete také dostat přetečení zásobníku, jakmile vstoupí main()dříve, než getrlimit/ setrlimitkód má šanci změnit velikost zásobníku. Nějaké velké lokální proměnné by proto měla být definována pouze ve funkcích, které se následně nazývají ze main()poté, co velikost zásobníku byl úspěšně zvýšena.

Odpovězeno 17/02/2010 v 22:55
zdroj uživatelem

hlasů
10

Místo toho stack_sizepoužít --stackjako tak:

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

Tento příklad by vám 4 MB místa zásobníku. Práce na MinGW je GCC, ale jak manpage říká: „Tato možnost je specifické pro i386 PE cílené port spojce“ (funguje tedy pouze pro výstup binární soubory Windows). Vypadá to, že tam není možnost pro ELF binárky.

Odpovězeno 16/02/2010 v 20:12
zdroj uživatelem

hlasů
2

Zvážit použití -fsplit-stackvolby https://gcc.gnu.org/wiki/SplitStacks

Odpovězeno 21/03/2017 v 10:29
zdroj uživatelem

hlasů
1

Změňte ji s ulimit bash vestavěný nebo setrlimit () nebo při přihlášení s PAM (pam_limits.so).

Je to nastavitelné mezní hodnoty prostředků; viz RLIMIT_STACK v setrlimit (2).

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

Odpovězeno 16/02/2010 v 20:14
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more