0

私はUbuntu 14.04 LTSに取り組んでいます。

execからコンパイルされた実行可能ファイルがありますfile.c。はfile.c静的ライブラリの関数を利用します。たとえば、fubar()で使用されているスタティック ライブラリの関数であるとしましょうfile.c。これは私が気づいたことです。

  • nm exec | grep fubar特定の値を与えます。
    (私のシステムと実行可能ファイルの場合0808377f
  • gdb ./execそしてbreak fubar、異なる値を与えます。
    (私のシステムと実行可能ファイルの場合0x8083785

別の実行可能ファイルに対して同様のことを行うと(exec1からコンパイルされfile1.c、両方のコマンドで同じ値が出力されます)。

どちらのコマンドも同じ仮想アドレスを出力するはずです。そうじゃない?私は明らかに何かが欠けています。誰かが正確に何が起こっているのか説明できますか? そして、両方のコマンドの違いは何ですか。

4

1 に答える 1

2

のような異常なことを除けば-fPIE、ここで起こっていることは、gdb コマンドbreak functionが実際には「関数のプロローグの後にブレークする」ことを意味するということfunctionです。このようにして、ブレークポイントに到達するまでに引数が適切に設定されます。

関数の最初の命令で正確に中断したい場合は、次の*ような構文を使用します。

(gdb) break *function

これを行うと、アドレスはおそらく一致します。

于 2015-05-29T18:31:42.930 に答える