最近、YASM を使用して Intel x86-64 アーキテクチャのアセンブリ言語を学び始めました。本で提案されているタスクの1つを解決しているときに(Ray Seyfarthによる)、次の問題に遭遇しました。
.bss セクションのバッファにいくつかの文字を配置すると、gdb でデバッグ中に空の文字列が表示されます。.data セクションのバッファに文字を配置すると、gdb で期待どおりに表示されます。
segment .bss
result resb 75
buf resw 100
usage resq 1
segment .data
str_test db 0, 0, 0, 0
segment .text
global main
main:
mov rbx, 'A'
mov [buf], rbx ; LINE - 1 STILL GET EMPTY STRING AFTER THAT INSTRUCTION
mov [str_test], rbx ; LINE - 2 PLACES CHARACTER NICELY.
ret
gdbで私は得る:
LINE 1: の後
x/s &buf
、結果 -0x7ffff7dd2740 <buf>: ""
行 2 の後:
x/s &str_test
、結果 -0x601030: "A"
が正しいアドレスに評価されていないように見える&buf
ため、まだすべてゼロが表示されます。0x7ffff7dd2740 は、その によると、デバッグ中のプロセスの BSS にない/proc/PID/maps
ため、意味がありません。 が間違ったアドレスに評価されるのに、正しいアドレスに評価されるのはなぜ&buf
&str_test
ですか? どちらも「グローバル」シンボルではありませんが、デバッグ情報を使用してビルドしました。
x86-64 Ubuntu 15.10 上の GNU gdb (Ubuntu 7.10-1ubuntu2) 7.10 でテスト済み。
で構築しています
yasm -felf64 -Worphan-labels -gdwarf2 buf-test.asm
gcc -g buf-test.o -o buf-test
nm
実行可能ファイルでは、正しいシンボル アドレスが表示されます。
$ nm -n buf-test # numeric sort, heavily edited to omit symbols from glibc
...
0000000000601028 D __data_start
0000000000601038 d str_test
...
000000000060103c B __bss_start
0000000000601040 b result
000000000060108b b buf
0000000000601153 b usage
(編集者注:奇妙さはOPのasmではなくgdbの動作にあるため、多くの質問を書き直しました!)。