GCC详细模式输出说明

Posted

技术标签:

【中文标题】GCC详细模式输出说明【英文标题】:GCC verbose mode output explanation 【发布时间】:2012-11-06 14:13:28 【问题描述】:

我是 Linux 新手。谁能向我解释我的 hello world 程序的以下详细模式输出?另外,文件crt1.ocrti.ocrtend.ocrtbegin.ocrtn.olclgcc 是做什么的?也欢迎任何其他解释性链接。

$ gcc -v hello.c

Reading specs from /usr/lib/gcc-lib/i686/3.3.1/specs
Configured with: ../configure --prefix=/usr
Thread model: posix
gcc version 3.3.1
 /usr/lib/gcc-lib/i686/3.3.1/cc1 -quiet -v -D__GNUC__=3 
 -D__GNUC_MINOR__=3 -D__GNUC_PATCHLEVEL__=1 
 hello.c -quiet -dumpbase hello.c -auxbase hello -Wall
 -version -o /tmp/cceCee26.s
GNU C version 3.3.1 (i686-pc-linux-gnu)
 compiled by GNU C version 3.3.1 (i686-pc-linux-gnu)
GGC heuristics: --param ggc-min-expand=51 
 --param ggc-min-heapsize=40036
ignoring nonexistent directory "/usr/i686/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/include
 /usr/lib/gcc-lib/i686/3.3.1/include
 /usr/include
End of search list.
 as -V -Qy -o /tmp/ccQynbTm.o /tmp/cceCee26.s
GNU assembler version 2.12.90.0.1 (i386-linux)
using BFD version 2.12.90.0.1 20020307 Debian/GNU
Linux
/usr/lib/gcc-lib/i686/3.3.1/collect2
 --eh-frame-hdr -m elf_i386 -dynamic-linker
 /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o
 /usr/lib/gcc-lib/i686/3.3.1/crtbegin.o
 -L/usr/lib/gcc-lib/i686/3.3.1
 -L/usr/lib/gcc-lib/i686/3.3.1/../../.. /tmp/ccQynbTm.o
 -lgcc -lgcc_eh -lc -lgcc -lgcc_eh
 /usr/lib/gcc-lib/i686/3.3.1/crtend.o
 /usr/lib/crtn.o

【问题讨论】:

这是其中的一部分:dev.gentoo.org/~vapier/crt.txt @ethrbunny 谢谢,这很有帮助! 【参考方案1】:

第一部分是编译器驱动程序的版本和配置数据(即gcc二进制文件,实际上并不是编译器本身):

Reading specs from /usr/lib/gcc-lib/i686/3.3.1/specs
Configured with: ../configure --prefix=/usr
Thread model: posix
gcc version 3.3.1

然后它打印它用来调用真正编译器的命令,cc1:

 /usr/lib/gcc-lib/i686/3.3.1/cc1 -quiet -v -D__GNUC__=3 
 -D__GNUC_MINOR__=3 -D__GNUC_PATCHLEVEL__=1 
 hello.c -quiet -dumpbase hello.c -auxbase hello -Wall
 -version -o /tmp/cceCee26.s

cc1 打印它的版本和配置信息。

GNU C version 3.3.1 (i686-pc-linux-gnu)
 compiled by GNU C version 3.3.1 (i686-pc-linux-gnu)
GGC heuristics: --param ggc-min-expand=51 
 --param ggc-min-heapsize=40036

然后cc1 告诉你它将在哪些目录中搜索包含文件。

ignoring nonexistent directory "/usr/i686/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/include
 /usr/lib/gcc-lib/i686/3.3.1/include
 /usr/include
End of search list.

编译器现在已经完成,所以gcc 告诉你它将使用的汇编器命令。

 as -V -Qy -o /tmp/ccQynbTm.o /tmp/cceCee26.s

汇编器as 会提供其版本信息。

GNU assembler version 2.12.90.0.1 (i386-linux)
using BFD version 2.12.90.0.1 20020307 Debian/GNU
Linux

现在汇编器已经完成,gcc 给出了链接器命令。它使用collect2 作为真正链接器ld 的中介,但这在这里并不重要。

/usr/lib/gcc-lib/i686/3.3.1/collect2
 --eh-frame-hdr -m elf_i386 -dynamic-linker
 /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o
 /usr/lib/gcc-lib/i686/3.3.1/crtbegin.o
 -L/usr/lib/gcc-lib/i686/3.3.1
 -L/usr/lib/gcc-lib/i686/3.3.1/../../.. /tmp/ccQynbTm.o
 -lgcc -lgcc_eh -lc -lgcc -lgcc_eh
 /usr/lib/gcc-lib/i686/3.3.1/crtend.o
 /usr/lib/crtn.o

链接器没有给出详细的输出(试试-Wl,-v),就是这样。

“crt”文件的意思是“C RunTime”。它们是在程序开头和结尾插入的一小段代码。他们负责初始化您的全局变量、堆和堆栈。在您从main 返回后,它们会调用atexit 函数。除此之外还有一些。

希望对您有所帮助。

【讨论】:

如果你设置-Wl,--verbose,链接器会给出详细的输出。它将打印获取所有输入的尝试,包括库。 这肯定值得+28!?非常有帮助。谢谢@ams

以上是关于GCC详细模式输出说明的主要内容,如果未能解决你的问题,请参考以下文章

Linux gcc编译之-std选项

MVVM 模式下iOS项目目录结构详细说明

Java中常用的设计模式都有哪些?请详细说明一下工厂模式。

linux下安装GCC

如何把android开发的时候把LogCat里的内容复制出来?如果不能复制,要是转储到文件中请说明详细步骤?

printf 格式化输出符号详细说明