解決したいこととしましては、Segmentation fault (core dumped)が出ている原因を知りたいです。
test.asm
section .bss section .data MSG: db "Hello World!!", 10 MSG_LEN equ $-MSG section .text global main main: nop .spike: mov eax, 0 add eax, 5 sub eax, 2 .print: mov eax, 4 mov ebx, 1 mov ecx, MSG mov edx, MSG_LEN int 80h; .final: mov eax, 0 ret
test.asmを
nasm -g -f elf64 -o test.o test.asm
でオブジェクトファイルにして
ld test.o exit.o -o test -O0 -g -static
で実行ファイルにしました。
※exit.oというのは_startから_libc_start_mainを経由せずに_mainに移動するようにしたものです。
まずgdb -q testでデバッガモードに入り、ブレークポイントをmainにおき、runで実行して、nextiで一つ一つ実行していきました。
以下がアセンブラになります。
0x4000b0 <main> nop 0x4000b1 <main.spike> mov $0x0,%eax 0x4000b6 <main.spike+5> add $0x5,%eax 0x4000b9 <main.spike+8> sub $0x2,%eax 0x4000bc <main.print> mov $0x4,%eax 0x4000c1 <main.print+5> mov $0x1,%ebx 0x4000c6 <main.print+10> mov $0x6000e8,%ecx 0x4000cb <main.print+15> mov $0xe,%edx 0x4000d0 <main.print+20> int $0x80 ここでエラー Program received signal SIGSEGVSegmentation fault. 0x4000d2 <main.final> mov $0x0,%eax 0x4000d7 <main.final+5> retq 0x4000d8 <_start> callq 0x4000b0 <main>
実行していくと、下から5行目の
0x4000d0 <main.print+20> int $0x80
というところに来るとSegmentation fault (core dumped)になります。
調べてみると、
メモリが割り当てられていない領域にアクセスしようとした
書き込みが禁止されている領域に書き込もうとした
実行が禁止されている領域のコードを実行しようとした
等が原因なのですが、なぜそうなっているかが分かりません。
この時のレジスターの状況が以下になります。
rax 0x4 4 rbx 0x1 1 rcx 0x6000e8 6291688 rdx 0xe 14 rsi 0x0 0 rdi 0x0 0 rbp 0x0 0x0 rsp 0x7ffffffee028 0x7ffffffee028 r8 0x0 0 r9 0x0 0 r10 0x0 0 r11 0x0 0 r12 0x0 0 r13 0x0 0 r14 0x0 0 r15 0x0 0 rip 0x4000d0 0x4000d0 <main.print+20> eflags 0x10306 [ PF TF IF RF ] cs 0x33 51 ss 0x2b 43 ds 0x0 0 es 0x0 0 fs 0x0 0 gs 0x0 0
また添付画像のように0x4000d0 <main.print+20>にいるときにinfo registerとしたので、
0x4000d0 <main.print+20>が実行される前のレジスタの状況と考えて間違いはないですよね?
調べに調べましたが原因が解決できないので質問しました。
宜しくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/29 09:08
2020/08/29 09:19
2020/08/29 09:23
退会済みユーザー
2020/08/31 10:31
退会済みユーザー
2020/08/31 21:47 編集