Префиксы меток сборки - PullRequest
0 голосов
/ 03 июля 2018

Может кто-нибудь объяснить разницу между этими метками в сборке?

Lfoo:

.Lfoo:

foo:

.foo:

Есть некоторая документация , но это немного неясно. Я пробовал это с системой 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 голосов
/ 03 июля 2018

Схема искажения имени и префикс для создания локального символа (то есть символа, который не отображается в таблице символов) зависят от вашей платформы и ассемблера. Нет единой комбинации, которая работает везде. Следующие два соглашения кажутся общими:

На целях, следующих традиционным соглашениям UNIX (например, цели aout, Mach-O и COFF), символы C украшены начальным подчеркиванием _, а локальные метки начинаются с L.

На мишенях ELF символы C не украшены, а локальные метки начинаются с .L.

Некоторые ассемблеры (например, nasm) отклоняются от этих соглашений для локальных меток. Например, в NASM локальные метки начинаются с одного периода . независимо от того, на какой цели вы находитесь.

Я не знаю, что такое соглашение вне UNIX (Windows похожа на UNIX в том смысле, что это цель COFF).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...