.text
.globl main
.ent main
Я не знаю, что делают .globl
и .ent
. Какова роль? Нужно ли мне постоянно использовать globl. main
и .ent main
?
.text
.globl main
.ent main
Я не знаю, что делают .globl
и .ent
. Какова роль? Нужно ли мне постоянно использовать globl. main
и .ent main
?
В вашем случае .globl
— это директива ассемблера, которая сообщает ассемблеру, что символ main
будет доступен из-за пределов текущего файла (то есть на него можно ссылаться из других файлов), а .ent
— это операция отладчика (псевдо), которая отмечает запись main
.
Это будет то же самое в любой другой ISA на ассемблере GNU GAS, например. на x86_64 Linux:
главная.S
.text
.global _start
_start:
/* exit syscall */
mov $60, %rax
mov exit_status, %rdi
syscall
exit_status.S
.data
.global exit_status
exit_status:
.quad 42
Собираем и запускаем:
as -o main.o main.S
as -o exit_status.o exit_status.S
ls -o main.out exit_statis.o main.o
./main.out
echo $?
дает:
42
Но если убрать строку:
.global exit_status
то ld
терпит неудачу с:
main.o: In function `_start':
(.text+0xb): undefined reference to `exit_status'
потому что он не может видеть символ exit_status
, который ему нужен.
.globl
и .global
являются синонимами, как указано в документации: https://sourceware.org/binutils/docs/as/Global.html#Global поэтому я просто предпочитаю использовать вариант с правильным написанием ;-)
Мы можем наблюдать, что происходит, изучая информацию, содержащуюся в файле объектные файлы ELF.
Для правильной программы:
nm hello_world.o mystring.o
дает:
main.o:
0000000000000000 T _start
U exit_status
exit_status.o:
0000000000000000 D exit_status
и для неудачника:
exit_status.o:
0000000000000000 d exit_status
А также:
man nm
содержит:
Тип символа. По крайней мере, используются следующие типы; другие также зависят от формата объектного файла. В нижнем регистре символ обычно является локальным; если в верхнем регистре, символ является глобальным (внешним). Однако есть несколько символов нижнего регистра, которые показаны для специальных глобальных символов («u», «v» и «w»).
"D" "d" The symbol is in the initialized data section. "T" "t" The symbol is in the text (code) section. "U" The symbol is undefined.
На уровне C вы можете управлять видимостью символа с помощью ключевого слова static
: означает статический в C?
Протестировано в Ubuntu 16.04, Binutils 2.26.1.