3

GCC manualから、次の全体的なオプションがあります。

-wrapper
ラッパー プログラムの下ですべてのサブコマンドを呼び出します。
ラッパー プログラムの名前とそのパラメーター
は、コンマ区切りのリストとして渡されます。

gcc -c tc -wrapper gdb,--args

gdb --args', thus the invocation of cc1 will beこれにより、 gdb --args cc1 ...' の下で gcc のすべてのサブプログラムが呼び出されます。

フラグの例と目的を理解するのに苦労しています。

gcc -c tcは toを作成ます。
そして何?オブジェクトファイルはgdbに送信されますか?
それともオブジェクトファイルを作成する責任がgdbに与えられていますか(おそらくデバッグ情報を追加していますか)?

4

3 に答える 3

3

コンパイル中gccに他のいくつかのプログラム (実際のアセンブラー、リンカーなど) を呼び出し、-wrapperフラグを使用してそれらのプログラムを上記のラッパー内で呼び出します。あなたの例では、すべてのサブコマンドが 内gdbで実行されます。これは、デバッグに役立ちgccます。

別の例: 呼び出されたすべてのサブコマンドのリストを取得するには、それらをラップできますecho(もちろん、この方法では実行されません)。

$ gcc 1.c  -wrapper echo
/usr/lib/gcc/x86_64-linux-gnu/4.6/cc1 -quiet -imultilib . -imultiarch x86_64-linux-gnu 1.c -quiet -dumpbase 1.c -mtune=generic -march=x86-64 -auxbase 1 -fstack-protector -o /tmp/cc7cQrsT.s
as --64 -o /tmp/ccaLYkv9.o /tmp/cc7cQrsT.s
/usr/lib/gcc/x86_64-linux-gnu/4.6/collect2 --sysroot=/ --build-id --no-add-needed --as-needed --eh-frame-hdr -m elf_x86_64 --hash-style=gnu -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/4.6 -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../.. /tmp/ccaLYkv9.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o
于 2012-12-26T11:08:07.323 に答える
3

はい、コンパイラ自体のデバッグ用です。または、コンパイラで何が起こっているかを「トレース」します。たとえば、それを実行してからcc1を実行するプログラムを追加することにより、cc1自体に渡された引数を出力できます。

gdb何も生成する責任はありません。cc1「適切なコンパイラ」をラップするだけです。gcc -c t.cコンパイラを最初に実行cpp -o t.i t.cすると、ファイルを前処理しt.cます。次に実行cc1 -o t.s t.iし、最後にas -o t.o t.s(またはそれらの行に沿って何かを実行します。ラッパーを使用すると、これらのコマンドを次のように実行しますgdb --args cc1 -o t.s t.i

cc1編集:もちろん、これは「実際の」コンパイルに比べてはるかに単純化されています。 などに渡される引数がたくさんあります。

于 2012-12-26T11:09:28.477 に答える
0

単純な hello world で試すこともできます。

gcc はさまざまなサブコマンドを呼び出します。これらの各サブコマンドには、ラッパーがプレフィックスとして付けられます。ラッパーとして gdb を与えるということは、コンパイラをデバッグしたいということです。

于 2012-12-26T11:09:40.910 に答える