Локальные метки в GNU ассемблере; обратная трассировка печати GDB, как будто этикетки являются функциями
Две части примера кода; сначала немного кода C ++, вызывающего в сборку:
/* 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;
}
... тогда сборка:
.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
Построен с:
as -g --32 test2.s -o test2.o
clang++ -m32 -g test1.cc -c
clang++ -m32 -g test*.o -o test
Запустите его под GDB, установите точку останова на stuff (), затем посмотрите на обратную трассировку:
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
После просеивания через [редактировать более старая копия] документации на ассемблере GNU, я пробовал метки с префиксомL
& с постфиксом$
чтобы увидеть, может ли это помешать экспорту ярлыков, но это не сработало.
Если я сделаю метки числовыми, обратная трассировка выглядит нормально, но мне не слишком нравится понятие использования числовых меток.
Может ли кто-нибудь указать мне правильное направление, пожалуйста?