2012-01-29 8 views
0

マイプラットフォームをブレークポイントiは、デバッグオプションで、GCCドライバでアセンブリソースをコンパイルする場合Ubuntuのi686の(32ビット)GCCは、

ある:

gcc -nostartfiles -g -o toupper toupper.s 

私は

012で最初instruccionにブレークポイントを生成

$ emacs toupper.s-> M-x gdb -> M-x gdb-many-windows 

Emacsエディタ上に集積gdbデバッガとTOUPPERの実行可能ファイルを開きます

(gdb) b _start 
(gdb) run 

コマンドを実行して起動すると、デバッガは_startラベルで正しく停止します。

私はldリンカとアセンブラやリンクなどと同じソースtoupper.sコンパイルする場合:今

as -g -o toupper.o toupper.s 
ld -o toupper toupper.o 

をデバッグするための手順は、gccの場合に一致しました。

$ emacs toupper.s -> M-x gdb -> M-x gdb-many-windows 
(gdb) b _start -> mark with a red point the _start line 
(gdb) run -> DONT HIT THE _start LINE ¿? 

私は、シンバルテーブルが正しいことを知っています。ブレークポイントは正しいことを示していますが、実行はステップバイステップではありません。

私はgccの場合に表示・デ・詳細な手順を持っており、AS/LDケースは一致していないgccの場合にいくつかのデフォルトのオプションがあり¿のように/ LDの場合と再びそれを試みたが、結果は同じ

のですか?あなたはgcc -nostartfiles -g ...でビルドする場合、事前

+0

ブレークポイントでデバッガが停止しないという問題はありますか? –

+0

そして、なぜ、-nostartfilesを使うのですか?どちらの方法でもコンパイルされます。 –

答えて

0

おかげで、GCCは(Linuxシステム上で少なくとも私のGCC)as-gdwarf2を渡します。 gccの呼び出しに-vを追加すると、実際のasコマンドが表示されます。

as -g ...で直接ビルドすると、-gdwarf2は渡されません。

私はと推測していますが、その動作の違いについてはが説明しています。 -gのバージョンがasであることを意味するものが何であるかわからないのはなぜですか?

+0

ありがとうございます。アセンブラの-gまたは-gdwarf2オプションは関係ありません。 gccフロントエンドリンクプロセスとld(binutilsリンカ)の違いは、collect2プログラムとのgccリンクです。アセンブラとして後でcollect2リンカを実行すると結果は正しいが、ldでリンクフェーズを実行すると、postdebuggingのステップが失敗する。 ldリンカーにcollect2相当のリンカーに一致するオプションを設定する必要があります。 ¿どちらですか? 。ありがとう。 – candido

+0

@candido Linuxでは、 'collect2'は単に' ld'を実行します。私が見る限り、新しいオプションは追加されません。 'collect'コマンドが' strace -v -fe trace = execve collect2 ... rest..of..collect2..args'を実行することによって呼び出される実際の 'ld'コマンドを見ることができます。 –

+0

@ロシア語を使うと、リンカーldは、テーブルシンボル解決のために 'libgcc.so'や' libc.so'のような共有ライブラリとのリンクが必要です。どうしてか分かりません。次のオプションは解決策です: 'ld -dynamic-linker /lib/ld-linux.so.2 -L/usr/lib/gcc/i486-linux-gnu/4.4.3 -lgcc --as-needed - lgcc_s --no-as-needed -lc -o toupper toupper.o' – candido