2010-02-16 44 views
33

En OSX durante la compilación del programa C++ con g++ utilizoCambiar tamaño de la pila para una aplicación C++ en Linux durante la compilación con el compilador GNU

LD_FLAGS= -Wl,-stack_size,0x100000000 

pero en SUSE Linux Recibo constantemente errores como:

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

y similar.

sé que es posible utilizar

ulimit -s unlimited 

pero esto no es agradable que no siempre se puede hacer un solo usuario que.

¿Cómo puedo aumentar el tamaño de la pila en Linux con GCC para una sola aplicación?

+0

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

+0

gcc --ver: gcc versión 4.1.2 20061115 (prelanzamiento) (SUSE Linux) – asdf

+0

Intentando establecer 'rlimit_stack' después de [Stack Clash] (http://www.openwall.com/lists/oss-security/2017/06/19/ 1) las soluciones pueden provocar fallas o problemas relacionados. También vea Red Hat [Issue 1463241] (https://bugzilla.redhat.com/show_bug.cgi?id=1463241) – jww

Respuesta

6

En lugar de stack_size, utilice --stack así:

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

En este ejemplo se le debe dar 4 MB de espacio de pila. Funciona en GCC de MinGW, pero como dice la página de manual, "Esta opción es específica del puerto del vinculador PE i386" (es decir, solo funciona para generar binarios de Windows). Parece que no hay una opción para los binarios ELF.

+0

desafortunadamente lo intenté y no funciona: /usr/lib64/gcc/x86_64-suse -linux/4.1.2 /../../../../ x86_64-suse-linux/bin/ld: opción no reconocida '--stack' /usr/lib64/gcc/x86_64-suse-linux/4.1.2 /../../../ ../ x86_64-suse-linux/bin/ld: use la opción --help para información de uso collect2: ld devuelto 1 estado de salida – asdf

+0

Sí, edité mi respuesta ya que noté que no funciona para la salida ELF. Lo siento, no soy de mucha ayuda aquí. – AndiDog

+2

Bueno, me salvaste. Estoy en Windows;). ¡Gracias! –

1

Cámbielo con ulimit bash built-in, o setrlimit(), o en el inicio de sesión con PAM (pam_limits.so).

Es un límite de recursos de usuario configurable ; ver RLIMIT_STACK en setrlimit (2).

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

+0

como dije, no puedo hacer eso También tengo que dar esta aplicación a otros usuarios, que no deben usar este truco – asdf

+1

No entiendo: la llamada a 'setrlimit' se puede hacer dentro de su código C++, al comienzo de 'main'. –

52

Es posible ajustar el tamaño de la pila mediante programación con setrlimit, por ejemplo,

#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: incluso cuando se utiliza este método para aumentar el tamaño de la pila no debe declarar grandes variables locales en main() en sí, ya que es muy posible conseguir un desbordamiento de pila tan pronto como entras en main(), antes del código getrlimit/setrlimit ha tenido la oportunidad de cambiar el tamaño de la pila. Por lo tanto, cualquier variable local grande debe definirse solo en funciones que posteriormente se llaman desde main(), después de que el tamaño de la pila se haya aumentado con éxito.

+0

error: 'rlim_t' no nombra un tipo – flow

+0

Asegúrese de tener los '' include's correctos para su sistema operativo, p. para Mac OS X sería '#include '. –

+0

Lo probé en SLES 11. Incluso si el valor está establecido, no puedo definir una variable local de acuerdo con el nuevo límite -> 'fallo de segmentación'. Solo cuando corro en la línea de comando 'ulimit -s 16000' entonces puedo definir una variable local como' char x [14000000] '. Aparentemente, el tamaño de la pila no se establece a través de este código. ¿Alguna idea? –

Cuestiones relacionadas