Etiquetas locales en ensamblador GNU; traza de impresión gdb como si las etiquetas fueran funciones
Dos piezas de código de ejemplo; primero un poco de código C ++ llamando al ensamblaje:
/* test1.cc */
#include <stdio.h>
extern "C" void blah();
extern "C" void stuff() {
printf( "This is a test\n" );
}
int main( int argc, char *argv[] ) {
blah();
return 0;
}
... entonces la asamblea:
.file "test2.s"
.text
.globl blah, stuff
.type blah,@function
.type stuff,@function
.align 16
blah:
/* normal function preamble */
pushl %ebp
movl %esp, %ebp
label1:
call stuff
leave
retn
Construido con:
as -g --32 test2.s -o test2.o
clang++ -m32 -g test1.cc -c
clang++ -m32 -g test*.o -o test
Ejecútelo en gdb, establezca un punto de interrupción en stuff (), luego mire la traza inversa:
gdb test
(gdb) break stuff
(gdb) run
(gdb) back
#0 stuff () at test1.cc:5
---> #1 0x08048458 in label1 () at test2.s:12
---> #2 0xffffc998 in ?? ()
#3 0x0804843e in main (argc=1, argv=0xffffca44) at test1.cc:9
Después de examinar [editar una copia anterior de] la documentación del ensamblador GNU, probé etiquetas con el prefijoL
y postfixed con$
para ver si evitaría que se exportaran las etiquetas, pero no funcionó.
Si hago que las etiquetas sean numéricas, la traza inversa parece normal, pero no me gusta demasiado la idea de usar etiquetas numéricas.
¿Podría alguien señalarme en la dirección correcta, por favor?