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

时间:2015-10-11 07:01:52

标签: assembly mips

       .text
.globl main
.ent   main

我不知道.globl.ent做了什么。 有什么作用? 我是否需要始终使用globl. main.ent main

2 个答案:

答案 0 :(得分:8)

在您的情况下,.globl是一个汇编程序指令,它告诉汇编程序可以从当前文件外部访问main符号(也就是说,它可以从其他文件引用),并且.ent是一个调试器(伪)操作,用于标记main的输入。

答案 1 :(得分:1)

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

main.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 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

包含:

  

符号类型。至少使用以下类型;其他的也取决于目标文件格式。如果是小写,则该符号通常是局部的;如果为大写,则符号为全局(外部)。但是,有一些小写的符号显示为特殊的全局符号(“ 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关键字:What does "static" mean in C?

来控制符号的可见性。

在Ubuntu 16.04,Binutils 2.26.1中进行了测试。

相关问题