Quiero saber cuál es el uso de la opción -mpreferred-stack-boundary
durante la compilación en el compilador de GNU. He revisado la documentación, pero la explicación se me escapó. ¿Podría alguien explicarlo?gcc-opción de límite de pila imprevista
Respuesta
Quiero saber de qué sirve la opción -border-stack-prefferred durante la compilación en el depurador de GNU.
La opción tiene absolutamente nada que ver con el depurador.
Afecta el código generado en su binario. Por defecto, GCC organizará las cosas para que cada función, inmediatamente después de la entrada, tenga su puntero de pila alineado en el límite de 16 bytes (esto puede ser importante si tiene variables locales, y habilite las instrucciones sse2
).
Si cambia la configuración predeterminada a p. -mpreferred-stack-boundary=2
, entonces GCC alineará el puntero de la pila en el límite de 4 bytes. Esto reducirá los requisitos de pila de sus rutinas, pero se bloqueará si su código (o código al que llama) hace usa sse2
, por lo que generalmente no es seguro.
Tiene que ver con los límites de byte que su programa usa cuando se presenta en la memoria.
Lo que hace un límite de pila = 2 es asegurar que la pila esté configurada en incrementos de tamaño dword, esto evita que su máquina optimice la pila.
Si se echa un vistazo:
`info gcc and search by entering "/mpreferred-stack-boundary"` it says:
>-mpreferred-stack-boundary=num
>
intento de mantener el límite pila alineada a un 2 elevado a la frontera de bytes num. Si no se especifica -preferred-stack-boundary, el valor predeterminado es 4 (16 bytes o 128 bits).
Un límite de pila predeterminado de 4 es el mismo para ambas máquinas Intel 386 y AMD x86-64.
Cuando trato de usar la "m-preferida-stack-límite = 2" opción en mi compilación de 64 bits máquina Linux falla con el error
"-mpreffered-stack-límite = 2 es no entre 4 y 12 ".
Esto se debe a que el ancho del campo de dirección se aumentó de 4 bytes a 8 bytes en máquinas de 64 bits. Por lo tanto, no puede escribir fragmentos individuales en un límite de pila = 2 porque 2^2 = 4 bytes. Sin embargo, curiosamente, un límite de pila de 3 sigue generando un error en las máquinas de 32 y 64 bits, que sería un límite de 8 bytes.
No puedo incluir el enlace porque no tengo 10 reputación ... pero una búsqueda hace las cosas bastante fáciles Por lo que puedo decir es una característica de seguridad porque 8 bytes es propenso a desalinear la pila ... sin duda, alguien más sabe mejor, o tiene más detalles.
How the stack got misaligned dice:
para asegurar la alineación adecuada de estos valores en la pila, el límite de pila debe ser como alineado como la requerida por cualquier valor almacenado en la pila. Además, cada función debe generarse de manera que mantenga la pila alineada. Por lo tanto, llamar a una función compilada con un límite de pila preferido superior a partir de una función compilada con un límite de pila preferido inferior probablemente desalineará la pila. Se recomienda que las bibliotecas que usan devoluciones de llamada usen siempre la configuración predeterminada.
Esta alineación extra consume espacio adicional en la pila y generalmente aumenta el tamaño del código. El código que es sensible al uso del espacio de la pila, como los sistemas integrados y los kernels del sistema operativo, puede querer reducir la alineación preferida a -mpreferred-stack-boundary = 2.
- 1. ¿Hay un límite de tamaño de pila de un proceso en Linux
- 2. Cómo evitar las 1024 líneas del límite de la pila de excepción de Java
- 3. ¿Cuál es la compensación para el límite de pila más pequeño?
- 4. ¿Por qué hay un límite en el tamaño de la pila?
- 5. iTunes Búsqueda límite de velocidad de API
- 6. Creación de objetos en la pila/pila?
- 7. ¿Cómo definir una pila de pila?
- 8. Variables de pila y pila falsas
- 9. La pila .NET vs pila de Windows
- 10. Joomla aumentar límite de tiempo límite de sesión frontend
- 11. ¿Qué es la pila de Linux?
- 12. perlre límite de longitud
- 13. Límite de luces OpenGL
- 14. Límite máximo de hilo?
- 15. elástico límite de búsqueda
- 16. límite de memoria PHP
- 17. Límite de memoria superior?
- 18. Intent.putExtras límite de tamaño?
- 19. establecer solo límite inferior de un límite para ggplot
- 20. -Xms: ¿tamaño de pila inicial o tamaño de pila mínimo?
- 21. Valgrind dice "asignación de pila", digo "asignación de pila"
- 22. Longitud de cadena de límite
- 23. Límite de número de Python
- 24. Límite de memoria de JavaScript
- 25. Problemas de tamaño de la pila de actividad de Android?
- 26. Desbordamiento de pila
- 27. Detección de pila detectada
- 28. C++ desbordamiento de pila
- 29. Extraño desbordamiento de pila?
- 30. uso de pila libGL
+1 Vale la pena mencionar que el tamaño del límite real es 2^PSB. Si establece este parámetro en 2, obtendrá un tamaño de límite de 2^2 = 4. Si lo configura en 4, obtendrá un tamaño de límite de 2^4 = 16. –