有人可以解释一下汇编中这些标签之间的区别吗?
Lfoo:
.Lfoo:
foo:
.foo:
有some documentation,但还不清楚。我在ELF系统上尝试过:
$ cat foo.S
Laaa:
jmp Laaa
.Lbbb:
jmp .Lbbb
aaa:
jmp aaa
.bbb:
jmp .bbb
$ clang -c foo.S -o foo.o
$ objdump -D foo.o
foo.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <Laaa>:
0: eb fe jmp 0 <Laaa>
2: eb fe jmp 2 <Laaa+0x2>
0000000000000004 <aaa>:
4: eb fe jmp 4 <aaa>
0000000000000006 <.bbb>:
6: eb fe jmp 6 <.bbb>
这似乎可以确认.L
是ELF的本地符号,但是这些符号显然没有以.
或_
开头。我知道_
用于C语言中的名称处理,但是.
的意义是什么?
答案 0 :(得分:3)
名称修饰方案和构成本地符号(即未出现在符号表中的符号)的前缀取决于您的平台和汇编程序。没有任何一种组合可以随处使用。以下两个约定似乎很常见:
在遵循传统UNIX约定的目标(例如aout,Mach-O和COFF目标)上,C符号用前导下划线_
装饰,而局部标签以L
开头。
在ELF目标上,不修饰C符号,并且局部标签以.L
开头。
某些汇编程序(例如nasm)与本地标签的这些约定有所不同。例如,在NASM上,本地标签以单个句点.
开头,与您所针对的目标无关。
我不知道UNIX之外的约定是什么(Windows类似于UNIX,因为它是COFF目标)。