gdbでasmsourceをデバッグするときに0x8048080である場合、コードへの開始エントリポイントとして選択されたアドレスはなぜですか?これは単なる相対オフセットであり、命令のメモリへの実際のオフセットではありませんよね?
2 に答える
アドレスに特別な意味はありませんが、アドレス0x8048080
には特別な意味があります0x08048000
。
後者のアドレスはデフォルトのアドレスであり、Linux/x86でld
最初のセグメントを開始します。PT_LOAD
Linux / x86_64では、デフォルトはです0x400000
。「カスタム」リンカースクリプトを使用してデフォルトを変更できます。セクションがフラグで.text
始まる場所を変更することもできます。-Wl,-Ttext,0xNNNNNNNN
ld
で開始した後0x08048000
、プログラムヘッダー用のスペースを追加し、組み込みのリンカースクリプトに従って実行可能ファイルの残りの部分をリンクします。これ-Wl,--verbose
は、リンク行に渡すかどうかを確認できます。
あなたのプログラムでは、プログラムヘッダーのサイズは常にであるよう0x80
に見えるので、.text
セクションは常にで始まります0x8048080
が、それは決して普遍的ではありません。
些細なint main() { return 0; }
プログラムをリンクする&_start == &.text
と、使用するコンパイラに応じて、、0x8048300
または0x8048178
になります。0x8048360
0×8048080は、Linuxldリンカーによって使用される仮想メモリのデフォルトのエントリポイントです。好きなように変更できます。
詳細については、http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints/を確認してください。