.text
.globl main
.ent main
.globl
と.ent
が何をするのかわかりません。役割は何ですか? globl. main
と.ent main
を常に使用する必要がありますか?
あなたの場合、.globl
は、現在のファイルの外部からmain
シンボルにアクセスできる(つまり、他のファイルから参照できる)ことをアセンブラーに通知するアセンブラーディレクティブであり、.ent
はデバッガー(疑似)です。 )main
のエントリをマークする操作。
これは、他の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でテスト済み。