3

gdbでasmsourceをデバッグするときに0x8048080である場合、コードへの開始エントリポイントとして選択されたアドレスはなぜですか?これは単なる相対オフセットであり、命令のメモリへの実際のオフセットではありませんよね?

4

2 に答える 2

4

アドレスに特別な意味はありませんが、アドレス0x8048080には特別な意味があります0x08048000

後者のアドレスはデフォルトのアドレスであり、Linux/x86でld最初のセグメントを開始します。PT_LOADLinux / x86_64では、デフォルトはです0x400000。「カスタム」リンカースクリプトを使用してデフォルトを変更できます。セクションがフラグで.text始まる場所を変更することもできます。-Wl,-Ttext,0xNNNNNNNN

ldで開始した後0x08048000、プログラムヘッダー用のスペースを追加し、組み込みのリンカースクリプトに従って実行可能ファイルの残りの部分をリンクします。これ-Wl,--verboseは、リンク行に渡すかどうかを確認できます。

あなたのプログラムでは、プログラムヘッダーのサイズは常にであるよう0x80に見えるので、.textセクションは常にで始まります0x8048080が、それは決して普遍的ではありません。

些細なint main() { return 0; }プログラムをリンクする&_start == &.textと、使用するコンパイラに応じて、、0x8048300または0x8048178になります。0x8048360

于 2011-05-09T00:14:34.067 に答える
1

0×8048080は、Linuxldリンカーによって使用される仮想メモリのデフォルトのエントリポイントです。好きなように変更できます。

詳細については、http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints/を確認してください。

于 2011-05-08T17:03:16.640 に答える