GNU/Linux >> Tutoriales Linux >  >> Linux

Imprime el valor del puntero de la pila

Un truco, que no es portátil o que ni siquiera se garantiza que funcione, es simplemente imprimir la dirección de un local como un puntero.

void print_stack_pointer() {
  void* p = NULL;
  printf("%p", (void*)&p);
}

Esto esencialmente imprimirá la dirección de p que es una buena aproximación del puntero de pila actual


No existe una forma portátil de hacerlo.

En GNU C, esto puede funcionar para las ISA de destino que tienen un registro denominado SP, incluido x86, donde gcc reconoce "SP" como abreviatura de ESP o RSP.

// broken with clang, but usually works with GCC
register void *sp asm ("sp");
printf("%p", sp);

Este uso de variables de registro local ahora está obsoleto en GCC:

El único uso admitido para esta función es especificar registros para operandos de entrada y salida al llamar a Extended asm

Definir una variable de registro no reserva el registro. Excepto cuando se invoca el asm extendido, los contenidos del registro especificado no están garantizados. Por este motivo, los siguientes usos no se admiten explícitamente. Si parece que funcionan, es solo una casualidad , y puede dejar de funcionar según lo previsto debido a (aparentemente) cambios no relacionados en el código circundante, o incluso cambios menores en la optimización de una versión futura de gcc. ...

También se rompe en la práctica con clang donde sp se trata como cualquier otra variable no inicializada.


Además de la respuesta de duedl0r con específicamente GCC podrías usar __builtin_frame_address(0) que es específico de GCC (pero no x86 específico).

Esto también debería funcionar en Clang (pero hay algunos errores al respecto).

Tomar la dirección de un local (como respondió JaredPar) también es una solución.

Tenga en cuenta que AFAIK el estándar C no requiere ninguna pila de llamadas en teoría.

Uno podría soñar con otras técnicas. Y podría tener pilas divididas (al menos en GCC reciente), en cuyo caso la noción misma de puntero de pila tiene mucho menos sentido (porque entonces la pila no es contigua y podría estar formada por muchos segmentos de unos pocos marcos de llamada cada uno) .


Linux
  1. ¿Tiempo de espera agotado en un script de Shell?

  2. ¿Alguna forma de imprimir el valor dentro de la variable dentro de una sola comilla?

  3. ¿Cómo imprimir las líneas número 15 y 25 de cada 50 líneas?

  4. Tratando de entender la complicada alineación de pila de gcc en la parte superior de main que copia la dirección de retorno

  5. Cómo imprimir pthread_t

Linux:¿cómo averiguar la familia de arquitectura Intel desde la línea de comandos?

¿Ordenar por valor hexadecimal?

Linux:¿cómo averiguar si hay archivos en una carpeta y salir en consecuencia (en Ksh)?

Cómo evitar los ataques de Stack Smashing con GCC

¿Cómo mapear la pila para la llamada al sistema clone () en Linux?

¿Qué establece fs:[0x28] (canario de pila)?