Es algo que me desconcierta durante mucho tiempo. Puedo observar que hay una diferencia entre la ejecución real de un programa y la controlada por gdb
.
Pero aquí hay un ejemplo:
-
Primero, aquí está el código de ejemplo (usamos una variable automática para obtener la ubicación de la pila):
#include <stdio.h> # include <stdlib.h>int main ( ) {char c = 0; printf ("Dirección de la pila:% p \ n", &c); return EXIT_SUCCESS;}
-
Luego, deshabilitamos el ASLR (usamos los indicadores de personalidad del proceso y no el método de todo el sistema a través de
/ proc / sys / kernel / randomize_va_space
):$ > setarch ʻuname -m` -R / bin / bash
-
Luego, ejecute en el entorno de memoria real:
Dirección de pila: 0x7fffffffe1df
-
Y, el mismo a través de
gdb
:(gdb) r Programa de inicio: ./gdb-against-reality Dirección de pila: 0x7fffffffe17f [Inferior 1 (proceso 5374) salió normalmente] ( gdb)
Entonces, aquí tenemos una diferencia de 96 bytes entre las dos ejecuciones. Pero, ¿cómo puedo predecir esta diferencia para un programa dado sin que se ejecute en el diseño de memoria real (solo conociendo el diseño de memoria gdb
)?
Y, además, ¿de dónde / qué viene esta diferencia?