Linux下C++程序组成
82人浏览 2024-06-03 18:02:23
GCC编译

- GCC 是一个驱动式的程序. 它调用其它程序来依次进行编译, 汇编和链接。
- GCC 分析命令行参数, 然后决定该调用哪一个子程序, 哪些参数应该传递给子程序。所有这些行为 都是由 SPEC 字符串(spec strings)来控制的。通常情况下, 每一个 GCC 可以调用的子程序都对应着 一个 SPEC 字符串, 不过有少数的子程序需要多个 SPEC 字符串来控制他们的行为。
predefines: 传递给 C 预处理器的宏定义
signed_char: 传递给 CPP 的用于说明 char 默认是否是有符号类型的宏
cpp: 传递给 C 预处理器的选项
cc1: 传递给 C 编译器的选项
cc1plus: 传递给 C++ 编译器的选项
asm: 传递给汇编器的选项
asm_final: 传递给汇编后处理器的选项
link: 传递给链接器的选项
linker: 设置链接器的名字
lib: 命令行传递给链接器的要包含的库
libgcc: 决定给链接器传递哪个 GCC 支持库
endfile: 链接的最后需要包含的目标文件
startfile: 一开始就需要传递给链接器的目标文件
- SPEC 字符串控制crt1.o, crti.o, crtbegin.o, crtend.o, crtn.o 等目标文件和hello.o链接成一个执行文 件。前面这5个目标文件的作用分别是启动、初始化、构造、析构和结束,它们通常会被自动链接 到应用程序中。
- ld script是ld提供的操作界面,用以对链接过程进行精确把控。使用ld linker script可以控制段的合 并顺序、地址空间分配和链接符号导出。
.interp
.note.gnu.build-i
.note.ABI-tag
.gnu.hash
.dynsym
.dynstr
.gnu.version
.gnu.version_r
.rela.dyn
.rela.plt
.init
.plt
.plt.got
.plt.sec
.text
.fini
.rodata
.rodata1
.eh_frame_hdr
.eh_frame
.gcc_except_table
.tdata
.tbss
.preinit_array
.init_array
.fini_array
.ctors
.dtors
.jcr
.data.rel.ro
.dynamic
.got
.data
.bss
.lbss
.lrodata
.ldata
.comment
.debug_aranges
.debug_info
.debug_abbrev
.debug_line
.debug_str
.symtab
.strtab
.shstrtab
- 可替换的标准c库,glibc、musl、uclibc、bionic、dietlibc、klibc、Newlib、eglibc
musl-gcc -static -Os hello.c -o hello
diet gcc -s -Os -pipe hello.c -o hello
- 可替换的链接器,Gold、BDF、LLD、Mold
-fuse-ld=bfd
-fuse-ld=gold
-fuse-ld=lld
-fuse-ld=mold
- 可替换的动态链接器
--dynamic-linker=ld-linux.so
GCC 辅助库
- libgcc_s编译器运行时(Compiler runtime)提供编译器隐式调用的函数的定义,以支持底层硬件不支 持的操作(例如,128位整数乘法),以及认为操作的内联展开不合适的地方。还提供了一系列 _Unwind_*函数,实现了Itanium C++ ABI(第I级)的语言无关的堆栈unwind部分。
- libatomic原子库(Atomics library)提供程序使用的原子操作,编译器无法直接降低他们到机器指令 (因为没有合适的机器指令或操作数不知道适当对齐),将会生成对一个运行时库__atomic_*函数 的一次调用。这些程序需要一个包含这些原子函数的运行时库。
- sanitizer 运行时以维持程序执行的侧面状态,并在发现问题时发出诊断信息。
- ibsupc++是 GCC 对Itanium C++ ABI规范的实现。但是,只有在静态链接libstdc++时才使用这个 库。libstdc++的动态库版本包含libsupc++的一个副本。
- gcc *.a
libasan.a
libatomic.a
libbacktrace.a
libgcc.a
libgcc_eh.a
libgcov.a
libgomp.a
libitm.a
liblsan.a
libquadmath.a
libssp_nonshared.a
libstdc++.a
libstdc++fs.a
libsupc++.a
libtsan.a
libubsan.a
- gcc *.so
libasan.so
libatomic.so
libcc1.so
libgcc_s.so
libgomp.so
libitm.so
liblsan.so
liblto_plugin.so
libquadmath.so
libstdc++.so
libtsan.so
libubsan.so
- gcc *.o
crtbegin.o
crtbeginS.o
crtbeginT.o
crtend.o
crtendS.o
crtfastmath.o
crtoffloadbegin.o
crtoffloadend.o
crtoffloadtable.o
crtprec32.o
crtprec64.o
crtprec80.o
libasan_preinit.o
liblsan_preinit.o
Glibc辅助库
- glibc *.o
Mcrt1.o
Scrt1.o
crt1.o
crti.o
crtn.o
gcrt1.o
grcrt1.o
libtsan_preinit.o
rcrt1.o
- glibc *.so 和glibc *.a
ld-2.21.so:用于动态库执行的辅助程序
libBrokenLocale.{a,so}:Glibc 内部的一个粗暴破解用来修复损坏程序(比如,一些 Motif 应用)。查看
文件 glibc-2.21/locale/broken_cur_max.c 里的注释来了解更多信息
libSegFault.so:段错误信号处理函数,catchsegv会用到
libanl.{a,so}:一个异步名字查找库
libc.{a,so}:主要的 C 库
libc_nonshared.a
libcidn.so:Glibc 内部用于在函数 getaddrinfo() 中处理国际化域名
libcrypt.{a,so}:密码学函数库
libdl.{a,so}:动态链接接口函数库
libg.a:不包含函数的一个空库。以前是 g++ 的运行时库
libieee.a:链接该模块会强制使用电气与电子工程师协会(IEEE) 定义的数学函数错误处理规则。默认的是
POSIX.1 错误处理。
libm.{a,so}:数学运算函数库
libmcheck.a:链接这个库后会打开内存分配检查
libmemusage.so:memusage 命令用它来协助收集应用程序里内存使用信息
libnsl.{a,so}:网络服务函数库
libnss.so:名称服务切换函数库,包含了解析主机名、用户名、组名、别称、服务、协议等等的函数。
libpcprofile.so:包含一些分析函数,用于跟踪特定源代码里的 CPU 时间占用情况
libpthread.{a,so}:POSIX 线程函数库
libresolv.{a,so}:包含了创建、发送和解析互联网域名服务器封包的函数
librpcsvc.a:包含了提供杂项 RPC 服务的函数
librt.{a,so}:包含了实现 POSIX.1b 实时扩展里规定的大部分接口的函数
libthread_db.so:包含了方便构建多线程程序调试工具的函数
libutil.{a,so}:包含各种 Unix 应用程序中用到的“标准” 函数的代码
依赖关系
- GLIBC对BinUtil、BISON、Python、GCC、linux kernel header有依赖, 使用高版本内核头文件编译的Glibc二进制文件完全可以运行在较低版本的内核上,并且当你升级 内核后新内核的特性仍然可以得到充分发挥而无需重新编译Glibc。但是如果编译时使用的头文件 的版本较低,那么运行在更高版本的内核上时,新内核的特性就不能得到充分发挥。

- GCC依赖
GMP:GNU多精度算术库
MPFR:GNU多精度浮点舍入库
MPC:GNU多精度C库
isl:是Integer Set Library的简写,是一款操作集和线性约束范围内整数点关系的库。支持的
操作集包括:交集、并集、差集、空虚检查,凸壳、仿射包(整数)、整数投影,以及使用
参数整数规划进行最小限度的字典计算。它还包括一个整数的规划求解基于广义的基础。

相关推荐
-
「PHP」MVC框架是什么?为什么要用它2025-02-25 00:25:41
-
如何用PHP写一个比较安全的API系统(实现)2025-02-25 00:19:49
-
php 解析url获取相关信息2025-02-25 00:15:37
-
mysql命令总结和PyMysql2025-02-25 00:11:35
-
MySQL特性:深入理解ICP2025-02-25 00:11:07