Local labels in GNU assembler; gdb printing backtrace as though labels are functions

妖精的绣舞 提交于 2019-12-10 21:24:13

问题


Two pieces of example code; first some C++ code calling into assembly:

/* 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;
}

... then the assembly:

.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

Built with:

as -g --32 test2.s -o test2.o
clang++ -m32 -g test1.cc -c
clang++ -m32 -g test*.o -o test

Run it under gdb, set a breakpoint on stuff(), then look at the backtrace:

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

After sifting through [edit an older copy of] the GNU assembler documentation, I tried labels prefixed with L & postfixed with $ to see if it would prevent the labels from being exported, but it didn't work.

If I make the labels numeric the backtrace looks normal, but I'm not overly fond of the notion of using numeric labels.

Could someone point me in the right direction, please?


回答1:


I found an answer in a different document detailing the GNU assembler; quoting from that doc:

A local symbol is any symbol beginning with certain local label prefixes. By default, the local label prefix is ‘.L’ for ELF systems or ‘L’ for traditional a.out systems, but each target may have its own set of local label prefixes.

Sure enough, as soon as I put .L on there, it worked.



来源:https://stackoverflow.com/questions/26065107/local-labels-in-gnu-assembler-gdb-printing-backtrace-as-though-labels-are-funct

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!