有人可以解释一下装配中这些标签之间的区别吗?
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 中用于名称修改,但是 的意义是什么.?
名称修改方案和生成本地符号(即未出现在符号表中的符号)的前缀取决于您的平台和汇编器。没有一种组合可以在任何地方发挥作用。以下两个约定似乎很常见:
在遵循传统 UNIX 约定的目标(例如 aout、Mach-O 和 COFF 目标)上,C 符号用前导下划线修饰_,本地标签以L.
在 ELF 目标上,C 符号未修饰,本地标签以 开头.L。
一些汇编程序(例如 nasm)偏离了这些本地标签约定。例如,在 NASM 上,本地标签以单个句点开头,.与您所在的目标无关。
我不知道 UNIX 之外的约定是什么(Windows 与 UNIX 类似,因为它是 COFF 目标)。