3

GCC 手册中,有以下总体选项:

-wrapper
调用包装程序下的所有子命令。
包装程序的名称及其参数
以逗号分隔列表的形式传递。

gcc -c tc -wrapper gdb,--args

这将调用gdb --args', thus the invocation of cc1 will begdb --args cc1 ...' 下的所有 gcc 子程序。

我无法理解该标志的示例和用途。

gcc -c tc将创建一个to
然后什么?目标文件被发送到gdb?
或者 gdb 是否有责任创建目标文件(asummingly 添加调试信息)?

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不负责生成任何东西,它只是围绕着cc1whihc 是“适当的编译器” - 当您运行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 回答