我是靠谱客的博主 真实耳机,这篇文章主要介绍GCC/G++编译过程GCC编译过程,现在分享给大家,希望可以做个参考。

GCC编译过程

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# 编写一个最简单的C++程序 $ cat hello.cpp int main() { return 0; } # -v选项可以打印出详细的编译过程,以及编译命令。 $ gcc -v -o hello hello.cpp Using built-in specs. # 使用内建的specs控制编译过程 COLLECT_GCC=gcc # 什么是LTO,参看下面的链接 # https://stackoverflow.com/questions/19807107/what-is-gcc-lto-wrapper/20448908 COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/10/lto-wrapper # TODO:不知道什么意思? OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa:hsa OFFLOAD_TARGET_DEFAULT=1 # 编译的目标平台 Target: x86_64-linux-gnu # 编译GCC时使用的配置选项(将单行输出换为多行,略调整选项顺序) Configured with: ../src/configure -v --prefix=/usr --libexecdir=/usr/lib --libdir=/usr/lib --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --program-suffix=-10 --program-prefix=x86_64-linux-gnu- --with-pkgversion='Ubuntu 10.1.0-2ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-10/README.Bugs --with-gcc-major-version-only --with-system-zlib --with-target-system-zlib=auto --with-tune=generic --with-default-libstdcxx-abi=new --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --without-included-gettext --without-cuda-driver --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,m2 --enable-shared --enable-linker-build-id --enable-threads=posix --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-multilib --enable-plugin --enable-default-pie --enable-libphobos-checking=release --enable-checking=release --enable-objc-gc=auto --enable-multiarch --disable-vtable-verify --disable-werror --enable-offload-targets=nvptx-none=/build/gcc-10-eDoCEC/gcc-10-10.1.0/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-10-eDoCEC/gcc-10-10.1.0/debian/tmp-gcn/usr,hsa Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 10.1.0 (Ubuntu 10.1.0-2ubuntu1~18.04) # 执行g++时的编译选项,其中-mtune与-march是两个默认选项,虽然未在命令上明确写出。 COLLECT_GCC_OPTIONS='-v' '-o' 'hello' '-mtune=generic' '-march=x86-64' # 调用C++编译器时执行的命令行; 这一步将源文件编译成汇编文件,保存为/tmp/cckOVIgw.s /usr/lib/gcc/x86_64-linux-gnu/10/cc1plus -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE hello.cpp -quiet -dumpbase hello.cpp -mtune=generic -march=x86-64 -auxbase hello -version -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -o /tmp/cckOVIgw.s # cc1plus的输出 GNU C++14 (Ubuntu 10.1.0-2ubuntu1~18.04) version 10.1.0 (x86_64-linux-gnu) compiled by GNU C version 10.1.0, GMP version 6.1.2, MPFR version 4.0.1, MPC version 1.1.0, isl version isl-0.19-GMP # ggc-min-expand/ggc-min-heapsize是GCC自身的垃圾回收可调参数 # 调整这两个参数或能提高编译速度,但是与代码生成无关。 GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 # 从这里开始是预处理器的输出(没有看到命令行,推测是由cc1plus执行了cpp程序) ignoring duplicate directory "/usr/include/x86_64-linux-gnu/c++/10" ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu" ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/10/include-fixed" ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/10/../../../../x86_64-linux-gnu/include" #include "..." search starts here: #include <...> search starts here: /usr/include/c++/10 # 以下是预处理器在查找头文件时默认的搜索路径 /usr/include/x86_64-linux-gnu/c++/10 /usr/include/c++/10/backward /usr/lib/gcc/x86_64-linux-gnu/10/include /usr/local/include /usr/include/x86_64-linux-gnu /usr/include End of search list. GNU C++14 (Ubuntu 10.1.0-2ubuntu1~18.04) version 10.1.0 (x86_64-linux-gnu) compiled by GNU C version 10.1.0, GMP version 6.1.2, MPFR version 4.0.1, MPC version 1.1.0, isl version isl-0.19-GMP GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: 435c9a72f92ce04eba08a47828fa63c4 # 执行g++时的命令行选项,其中-mtune与-march是两个默认选项,虽然未在命令上明确写出。 COLLECT_GCC_OPTIONS='-v' '-o' 'hello' '-mtune=generic' '-march=x86-64' # as命令行选项(由g++的命令行选项推演构造as的命令行选项);生成临时目标文件/tmp/cc1LTqcs.o as -v --64 -o /tmp/cc1LTqcs.o /tmp/cckOVIgw.s # 以下是汇编器的输出 GNU assembler version 2.36.50 (x86_64-pc-linux-gnu) using BFD version (GNU Binutils) 2.36.50.20210412 COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/10/:/usr/lib/gcc/x86_64-linux-gnu/10/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/10/:/usr/lib/gcc/x86_64-linux-gnu/ LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/10/:/usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/10/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/10/../../../:/lib/:/usr/lib/ # 执行g++时的命令行选项,其中-mtune与-march是两个默认选项,虽然未在命令上明确写出。 COLLECT_GCC_OPTIONS='-v' '-o' 'hello' '-mtune=generic' '-march=x86-64' # 链接器命令行选项;将目标文件链接成可执行文件 # 这里链接器命令并不是ld,而是collect2;可能是由于GCC支持指定多种链接器,ld只是其中之一。 # 命令行经过换行编辑,方便浏览 /usr/lib/gcc/x86_64-linux-gnu/10/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/10/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/10/lto-wrapper -plugin-opt=-fresolution=/tmp/ccC6Zv8n.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --build-id # 出现这个选项是否是由于GCC编译时指定的--enable-linker-build-id起的作用 --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o hello # 生成的可执行文件名 /usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/Scrt1.o # 以下是其他必需的目标代码 /usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/10/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/10 # -L用于指定库文件搜索路径 -L/usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/10/../../../../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/10/../../.. /tmp/cc1LTqcs.o # 汇编器生成的目标文件 -lgcc --push-state --as-needed # -l指定要链接的库 -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/x86_64-linux-gnu/10/crtendS.o # 必须的目标文件 /usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/crtn.o # 后续还可能有其他操作?至少这个简单的基本编译过程没有后续操作。 COLLECT_GCC_OPTIONS='-v' '-o' 'hello' '-mtune=generic' '-march=x86-64'

最后

以上就是真实耳机最近收集整理的关于GCC/G++编译过程GCC编译过程的全部内容,更多相关GCC/G++编译过程GCC编译过程内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部