为什么我们在 MIPS 汇编语言中使用 .globl main?

Why do we use .globl main in MIPS assembly language?

       .text
.globl main
.ent   main

我不知道 .globl.ent 是做什么的。 作用是什么? 我需要一直使用 globl. main.ent main 吗?

在你的例子中,.globl 是一个汇编程序指令,它告诉汇编程序可以从当前文件外部访问 main 符号(也就是说,它可以从其他文件中引用) , 而 .ent 是一个调试器(伪)操作,它标记了 main.

的条目

在 GNU GAS 汇编程序上的任何其他 ISA 中都将是相同的,例如关于 x86_64 Linux:

main.S

.text
.global _start
_start:
    /* exit syscall */
    mov , %rax
    mov exit_status, %rdi
    syscall

exit_status.S

.data
.global exit_status
exit_status:
    .quad 42

Assemble 和 运行:

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 object files.

中包含的信息来观察发生了什么

对于正确的程序:

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

包含:

The symbol type. At least the following types are used; others are, as well, depending on the object file format. If lowercase, the symbol is usually local; if uppercase, the symbol is global (external). There are however a few lowercase symbols that are shown for special global symbols ("u", "v" and "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 关键字控制符号可见性:What does "static" mean in C?

在 Ubuntu 16.04、Binutils 2.26.1 中测试。