2012-04-20 22 views

Respuesta

9

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.

+2

+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. –

0

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.