GCC的“-wrapper”标志有什么作用?

时间:2012-12-26 11:02:26

标签: gcc gdb compiler-flags

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添加调试信息)?

3 个答案:

答案 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作为包装器意味着您要调试编译器。