Gom*_*thi 13 linux gcc verbose
我是linux的新手.任何人都可以向我解释我的hello world程序的以下详细模式输出吗?另外,做了什么文件crt1.o
,crti.o
,crtend.o
,crtbegin.o
和crtn.o
和lc
和lgcc
做什么?还欢迎任何其他解释性链接.
$ 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
Run Code Online (Sandbox Code Playgroud)
ams*_*ams 23
第一部分是编译器驱动程序的版本和配置数据(即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
Run Code Online (Sandbox Code Playgroud)
然后它打印出用于调用真实编译器的命令,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
Run Code Online (Sandbox Code Playgroud)
并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
Run Code Online (Sandbox Code Playgroud)
然后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.
Run Code Online (Sandbox Code Playgroud)
编译器现在已经完成,因此会gcc
告诉您它将使用的汇编程序命令.
as -V -Qy -o /tmp/ccQynbTm.o /tmp/cceCee26.s
Run Code Online (Sandbox Code Playgroud)
汇编程序as
会给出它的版本信息.
GNU assembler version 2.12.90.0.1 (i386-linux)
using BFD version 2.12.90.0.1 20020307 Debian/GNU
Linux
Run Code Online (Sandbox Code Playgroud)
汇编程序现在已完成,因此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
Run Code Online (Sandbox Code Playgroud)
链接器没有提供详细的输出(尝试-Wl,-v
),所以就是这样.
"crt"文件表示"C RunTime".它们是在程序开始时和最后插入的一小段代码.它们负责初始化全局变量,堆和堆栈.他们atexit
从你回来后调用函数main
.还有一些.
希望有所帮助.
归档时间: |
|
查看次数: |
48012 次 |
最近记录: |