関数の長さを決定するためにGDBはどのようなアプローチを取りますか?main()から2バイトを削除した後、GDBは関数がまだ元の長さであると信じていたので、デバッグ情報を使用していると思いますか?
特に、main()の終わりは元々次のとおりでした。
0x00000000004005a1 <+133>: mov edi,0x4006ac
0x00000000004005a6 <+138>: call 0x4003a0 <puts@plt>
0x00000000004005ab <+143>: mov eax,0x0
0x00000000004005b0 <+148>: leave
0x00000000004005b1 <+149>: ret
次に、2バイトを削除した後(プログラムリストの前半):
0x000000000040059f <+131>: mov edi,0x4006ac
0x00000000004005a4 <+136>: call 0x40039e
0x00000000004005a9 <+141>: mov eax,0x0
0x00000000004005ae <+146>: leave
0x00000000004005af <+147>: ret
0x00000000004005b0 <+148>: nop
0x00000000004005b1 <+149>: nop
つまり、GDBは、全長は同じであると考えています。GDBがこれをどのように行うのか知りたいのですが。
ファイルの種類は次のとおりです。a.out:ELF 64ビットLSB実行可能ファイル、x86-64、バージョン1(SYSV)、動的リンク(共有ライブラリを使用)、ストリップされない引数なしで「gcc」を使用して作成されます。