web-dev-qa-db-ja.com

MIPSアセンブリ言語で.globlmainを使用するのはなぜですか?

       .text
.globl main
.ent   main

.globl.entが何をするのかわかりません。役割は何ですか? globl. main.ent mainを常に使用する必要がありますか?

8
Goodmorning

あなたの場合、.globlは、現在のファイルの外部からmainシンボルにアクセスできる(つまり、他のファイルから参照できる)ことをアセンブラーに通知するアセンブラーディレクティブであり、.entはデバッガー(疑似)です。 )mainのエントリをマークする操作。

8
NlightNFotis

これは、他のISA GNU GASアセンブラ、たとえば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オブジェクトファイル に含まれている情報を調べることで、何が起こっているかを観察できます。

正しいプログラムの場合:

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、Binutils2.26.1でテスト済み。