两段示例代码;首先调用汇编的一些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
&amp;为前缀的标签。后缀为$
以查看是否会阻止标签导出,但它不起作用。
如果我将标签设为数字,则回溯看起来很正常,但我并不过分喜欢使用数字标签的概念。
有人能指出我正确的方向吗?
答案 0 :(得分:3)
我在另一份详细说明GNU汇编程序的文件中找到了答案;引用该文件:
本地符号是以某些本地标签前缀开头的任何符号。默认情况下 对于ELF系统,本地标签前缀是'.L',对于传统的a.out系统,本地标签前缀是'L',但是每个目标 可能有自己的一组本地标签前缀。
果然,只要我把.L
放在那里,就可以了。