程序集标签前缀

时间:2018-07-03 09:19:16

标签: assembly

有人可以解释一下汇编中这些标签之间的区别吗?

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语言中的名称处理,但是.的意义是什么?

1 个答案:

答案 0 :(得分:3)

名称修饰方案和构成本地符号(即未出现在符号表中的符号)的前缀取决于您的平台和汇编程序。没有任何一种组合可以随处使用。以下两个约定似乎很常见:

在遵循传统UNIX约定的目标(例如aout,Mach-O和COFF目标)上,C符号用前导下划线_装饰,而局部标签以L开头。

在ELF目标上,不修饰C符号,并且局部标签以.L开头。

某些汇编程序(例如nasm)与本地标签的这些约定有所不同。例如,在NASM上,本地标签以单个句点.开头,与您所针对的目标无关。

我不知道UNIX之外的约定是什么(Windows类似于UNIX,因为它是COFF目标)。