GCC';s"-包装纸;你怎么办?

GCC';s"-包装纸;你怎么办?,gcc,gdb,compiler-flags,Gcc,Gdb,Compiler Flags,从中,有以下总体选项: -wrapper 调用包装程序下的所有子命令。 包装程序的名称及其参数 以逗号分隔的列表形式传递 gcc-ctc-wrapper-gdb,--args 这将调用gdb--args'下的所有gcc子程序 cc1的调用将是gdb--args cc1…' 我很难理解这个例子和国旗的用途 gcc-c t.c将创建一个t.o 然后呢?目标文件是否发送到gdb? 或者gdb有责任创建目标文件(添加调试信息)?在编译期间,gcc调用一些其他程序(实际的汇编程序、链接器等),并使用-wr

从中,有以下总体选项:

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

gcc-ctc-wrapper-gdb,--args

这将调用
gdb--args'下的所有gcc子程序
cc1的调用将是
gdb--args cc1…'

我很难理解这个例子和国旗的用途

gcc-c t.c将创建一个t.o
然后呢?目标文件是否发送到gdb?

或者gdb有责任创建目标文件(添加调试信息)?

在编译期间,gcc调用一些其他程序(实际的汇编程序、链接器等),并使用
-wrapper
标记在所述包装内调用它们。在您的示例中,所有子命令都在
gdb
中执行,这对于调试
gcc
非常有用

另一个示例:要获取所有调用的子命令的列表,可以将它们包装在
echo
中(当然,它们不是以这种方式执行的):


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

gdb
不负责生成任何内容,它只是围绕着
cc1
进行包装,当您运行
gcc-ct.c
时,编译器首先运行
cpp-o t.i t.c
来预处理
t.c
文件。然后它运行
cc1-ott.stt.i
,最后运行
as-ott.tot.s
(或者类似于这些行的东西。使用包装器,它将运行这些命令,例如,
gdb--args cc1-ott.sti


编辑:与“真实”编译相比,这当然要简单得多-有一大堆参数传递给
cc1
,等等。

您可以在一个简单的hello world上尝试它

gcc将调用不同的子命令。每个子命令都将以包装器作为前缀。将gdb作为包装器表示您希望调试编译器

$ 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