GNU 汇编器中的本地标签;gdb 打印回溯,就像标签是函数一样

Bri*_*erg 5 assembly gdb gnu-assembler backtrace debug-symbols

两段示例代码;首先是一些调用程序集的 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;
}
Run Code Online (Sandbox Code Playgroud)

...然后大会:

.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
Run Code Online (Sandbox Code Playgroud)

内置:

as -g --32 test2.s -o test2.o
clang++ -m32 -g test1.cc -c
clang++ -m32 -g test*.o -o test
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

在筛选[编辑旧副本] GNU 汇编器文档后,我尝试使用前缀为L& 后缀$为的标签,以查看它是否会阻止导出标签,但它不起作用。

如果我将标签设为数字,则回溯看起来很正常,但我并不太喜欢使用数字标签的概念。

有人能指出我正确的方向吗?

Bri*_*erg 7

在 GNU 汇编器手册中找到了答案;引用该文档:

局部符号是任何以特定局部标签前缀开头的符号。默认情况下,ELF 系统的本地标签前缀为“.L”,传统 a.out 系统的本地标签前缀为“L”,但每个目标可能有自己的一组本地标签前缀。

果然,我一穿上.L就奏效了。

.L 标签不会在目标文件中显示为符号。