0

私のプラットフォームはubuntu i686(32ビット)です

デバッグ オプションを使用して gcc ドライバーを使用してアセンブリ ソースをコンパイルする場合:

gcc -nostartfiles -g -o toupper toupper.s 

emacsエディターに統合されたgdbデバッガーでtoupper実行可能ファイルを開きます

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

最初の命令でブレークポイントを生成しました

(gdb) b _start
(gdb) run

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

同じソース toupper.s を as アセンブラーでコンパイルし、ld リンカーでリンクすると、次のようになります。

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 ケースで再試行しましたが、結果は同じです

as/ld ケースと一致しない gcc ケースのデフォルト オプションがありますか?

前もって感謝します

4

1 に答える 1

1

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

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

それが行動の違いを説明していると思います。-gのバージョンにとって何を意味するのasか、またはなぜそれが重要なのかがわかりません。

于 2012-01-30T05:45:40.017 に答える