从GCC manual开始,有以下整体选项:
-wrapper
在包装器程序下调用所有子命令 包装程序的名称及其参数
以逗号分隔列表的形式传递。gcc -c t.c -wrapper gdb, - args
这将调用
gdb --args', thus the invocation of cc1 will be
gdb --args cc1 ...'下的所有gcc子程序。
我无法理解旗帜的例子和目的。
gcc -c t.c 会创建 t.o 。
然后什么?目标文件发送到gdb?
或者gdb是否负责创建目标文件(asummingly添加调试信息)?
答案 0 :(得分:3)
在编译期间gcc
调用一些其他程序(实际的汇编程序,链接器等),并在{@ 1}}标记内调用它们在所述包装器中。在您的示例中,所有子命令都在-wrapper
内执行,这对于调试gdb
非常有用。
另一个例子:要获取所有被调用的子命令的列表,可以将它们包装在gcc
中(当然,它们不会以这种方式执行):
echo
答案 1 :(得分: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
等。
答案 2 :(得分:0)
你可以在一个简单的hello世界中尝试过它。
gcc将调用不同的子命令。这些子命令中的每一个都将以包装器为前缀。将gdb作为包装器意味着您要调试编译器。