装配标签前缀

Tim*_*mmm 5 assembly

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

Lfoo:

.Lfoo:

foo:

.foo:
Run Code Online (Sandbox Code Playgroud)

一些文档,但有点不清楚。我用 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>
Run Code Online (Sandbox Code Playgroud)

这似乎证实了这.L是 ELF 的本地符号,但是这些符号显然不必.或开头_。我知道_在 C 中用于名称修改,但是 的意义是什么.

fuz*_*fuz 6

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

在遵循传统 UNIX 约定的目标(例如 aout、Mach-O 和 COFF 目标)上,C 符号用前导下划线修饰_,本地标签以L.

在 ELF 目标上,C 符号未修饰,本地标签以 开头.L

一些汇编程序(例如 nasm)偏离了这些本地标签约定。例如,在 NASM 上,本地标签以单个句点开头,.与您所在的目标无关。

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