2010-02-16 6 views
33

in OSX durante la compilazione del programma C++ con g++ Io usoModifica dimensione dello stack per un'applicazione C++ in Linux durante la compilazione con GNU compilatore

LD_FLAGS= -Wl,-stack_size,0x100000000 

ma in SUSE Linux Ricevo constantemente errori come:

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

e simili.

so che è possibile utilizzare

ulimit -s unlimited 

ma questo non è bello come non sempre può un singolo utente farlo.

Come posso aumentare le dimensioni dello stack in Linux con GCC per una singola applicazione?

+0

se aiuta: 2.6.18.8-0.9-default # 1 SMP Dom 10 Feb 22:48:05 UTC 2008 x86_64 x86_64 x86_64 GNU/Linux – asdf

+0

gcc --ver: versione gcc 4.1.2 20061115 (prerelease) (SUSE Linux) – asdf

+0

Tentativo di impostare 'rlimit_stack' dopo [Stack Clash] (http://www.openwall.com/lists/oss-security/2017/06/19/ 1) le riparazioni possono causare guasti o problemi correlati. Vedi anche Red Hat [Issue 1463241] (https://bugzilla.redhat.com/show_bug.cgi?id=1463241) – jww

risposta

6

Invece di stack_size, utilizzare --stack in questo modo:

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

Questo esempio dovrebbe darvi 4 MB di spazio di stack. Funziona su GCC di MinGW, ma come dice la manpage, "Questa opzione è specifica per la porta di destinazione i386 PE del linker" (cioè funziona solo per l'output di file binari di Windows). Sembra che non ci sia un'opzione per i binari ELF.

+0

sfortunatamente ho provato questo e non funziona: /usr/lib64/gcc/x86_64-suse -linux/4.1.2 /../../../../ x86_64-suse-linux/bin/ld: opzione non riconosciuta '--stack' /usr/lib64/gcc/x86_64-suse-linux/4.1.2 /../../../ ../ x86_64-suse-linux/bin/ld: usa l'opzione --help per informazioni sull'uso collect2: ld restituisce 1 stato di uscita – asdf

+0

Sì, modifica la mia risposta poiché ho notato che non funziona per l'output ELF. Scusa, non sono di grande aiuto qui. – AndiDog

+2

Beh, mi hai salvato. Sono su Windows;). Grazie! –

1

Sostituirlo con ulimit bash builtin, o setrlimit() o al login con PAM (pam_limits.so).

È un limite impostabile per le risorse utente ; vedi RLIMIT_STACK in setrlimit (2).

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

+0

come ho detto, non posso farlo Devo anche dare questa app ad altri utenti, che non dovrebbero usare questo trucco – asdf

+1

Non capisci: la chiamata a 'setrlimit' può essere fatta all'interno del tuo codice C++, all'inizio di 'main'. Errore –

52

È possibile impostare la dimensione dello stack a livello di codice con setrlimit, per esempio

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

Nota: anche quando si utilizza questo metodo per aumentare le dimensioni dello stack non si deve dichiarare di grandi dimensioni variabili locali in main() sé, dal momento che si potrebbe ottenere un overflow dello stack, non appena si entra main(), prima che il codice getrlimit/setrlimit ha avuto la possibilità di cambiare la dimensione dello stack. Eventuali variabili locali di grandi dimensioni dovrebbero pertanto essere definite solo in funzioni che vengono successivamente chiamate da main(), dopo che la dimensione dello stack è stata aumentata con successo.

+0

: 'rlim_t' non specifica un tipo – flow

+0

Assicurati di avere il '# include' corretto per il tuo sistema operativo, ad es. per Mac OS X sarebbe '#include '. –

+0

L'ho provato su SLES 11. Anche il valore è impostato Non posso definire una variabile locale in base al nuovo limite -> 'errore di segmentazione'. Solo quando eseguo la riga di comando 'ulimit -s 16000', posso definire una variabile locale come' char x [14000000] '. Apparentemente la dimensione dello stack non è impostata tramite questo codice. Qualche idea? –