GCC的"-wrapper"标志是什么作用?

3
GCC手册中,有以下总体选项:
-blockquote>

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

gcc -c t.c -wrapper gdb,--args

这将在gdb --args'下调用gcc的所有子程序,因此 cc1的调用将是gdb --args cc1 ...'。

我不明白这个例子和标志的目的。

gcc -c t.c将创建一个t.o
然后呢?目标文件被发送到gdb吗?
还是gdb负责创建目标文件(假设添加调试信息)?

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

3
是的,用于调试编译器本身。或者以其他方式“跟踪”编译器中正在进行的操作-例如,您可以通过添加一个程序来打印传递给cc1本身的参数,然后运行cc1来实现这一点。
gdb不负责生成任何内容,它只是包装了cc1,而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的参数等等。

0

你可以在一个简单的“Hello World”程序上尝试它。

gcc将调用不同的子命令。每个子命令都将以包装器为前缀。使用gdb作为包装器意味着您想要调试编译器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接