1

関数の長さを決定するために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」を使用して作成されます。

4

1 に答える 1

8

関数の長さを決定するためにGDBはどのようなアプローチを取りますか?

ELFシンボルテーブル(.st_sizeメンバー)を調べます。あなたはそれを見ることができますreadelf -s a.out | grep main

于 2012-10-16T15:20:49.783 に答える