c标准运行库也即libc.a大概实现了如下功能
启动与退出:如exit
标准函数:如printf、strlen
io函数:如fread、fwrite
堆:如malloc、free
c标准运行库的函数对任何系统通用(c函数跨操作系统平台),它将不同操作系统的API抽象
成相同的库函数(c标准函数)如,库函数fread在Linux最终会调用read函数,在windows最终会调用readfile函数。
glibc是c标准库在Linux中的扩展(超集),扩展了Linux特性的函数库,如pthread等。glibc也就成了linux系统
的标准c库。glibc除了包括libc.a,libpthread.a等标准库外,还包括/usr/lib/crt1.o 、/usr/lib/crti.o、 /usr/lib/crtn.o。
crt1.o 里面包含程序入口函数_start,它负责调用__libc_start_main初始化libc并调用main函数进入程序主体。
可执行文件中的.init和.finit两个段在链接时由各输出文件(.o)的.init段和.fini段和并而成,包含_init和_finit两个函数的实现
crti.o和crtn.o中包含的代码实际是_init和_finit两个函数的开始部分和结尾部分,即_init函数的开始部分来自于crti.o的.init段,结束部分来自于crtn.o的.init段
文件链接时的顺序为:
ld crt1.o crti.o user.o libc.a libuser.a crtn.o
c程序运行的调用关系如下:
_start-->__libc_start_main
-->__libc_csu_init //调用_init()-->_do_gloabal_ctors_aux(构造 由gcc中crtbeginT.o文件提供)
-->main //主函数
-->exit-->__libc_csu_finit //负责调用_finit函数
gcc中包括:crtbeginT.o、crtend.o、 libgcc.a、 libgcc_eh.a
c++的实现与编译器密切相关的,glibc只是一个c运行库,它对c++的实现不了解,而gcc是c++的真正实现者