Почему мы используем .globl main в языке ассемблера MIPS?

       .text
.globl main
.ent   main

Я не знаю, что делают .globl и .ent. Какова роль? Нужно ли мне постоянно использовать globl. main и .ent main?


person Goodmorning    schedule 11.10.2015    source источник


Ответы (2)


В вашем случае .globl — это директива ассемблера, которая сообщает ассемблеру, что символ main будет доступен из-за пределов текущего файла (то есть на него можно ссылаться из других файлов), а .ent — это операция отладчика (псевдо), которая отмечает запись main.

person NlightNFotis    schedule 11.10.2015

Это будет то же самое в любой другой 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.

person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 08.02.2019