为什么我们在 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 中测试。
.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 中测试。