2012-12-26 114 views
2

GCC manual,有下列选项整体:GCC的“-wrapper”标志是做什么的?

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

GCC -c T.C -wrapper GDB, - ARGS

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

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

gcc -c t.c将创建一个t.o
然后呢?目标文件被发送到gdb?
或者是gdb被赋予创建目标文件的责任(正在添加调试信息)?

回答

2

是,用于调试编译器本身。或者“跟踪”编译器中发生的事情 - 例如,您可以通过添加一个程序来打印传递给cc1本身的参数,然后运行cc1。

gdb不负责产生任何东西,它只是披着cc1 whihc是“正确的编译器” - 当您运行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参数等

1

在编译过程中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 
0

你可能已经尝试过了一个简单的Hello World。

GCC会调用不同的子命令。每个子命令将包装作为前缀。给予GDB作为包装意味着您要调试编译器。