簡體   English   中英

為什么我們在 MIPS 匯編語言中使用 .globl main?

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

       .text
.globl main
.ent   main

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

在您的情況下, .globl是一個匯編器指令,它告訴匯編器可以從當前文件外部訪問main符號(也就是說,它可以從其他文件中引用),而.ent是一個調試器(偽)操作標記main的入口。

它在 GNU GAS 匯編器上的任何其他 ISA 中都是相同的,例如在 x86_64 Linux 上:

電源

.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 : .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 中測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM