crt1.o,crti.o,crtbegin.o,crtend.o ,crtn.o 与libc.so 的关系


crt1.o,crti.o,crtbegin.o,crtend.o ,crtn.o  这些库构成了程序启动,结束,构造,析构等代码片!

但是这些库依赖于libc.so


crt1.o里面包含的就是程序的入口函数_start,由它负责调用__libc_start_main初始化libc并且调用main函数进入真正的程序主体。

实际上最初开始的时候它并不叫做crt1.o,而是叫做crt.o,包含了基本的启动、退出代码。

由于当时有些链接器对链接时目标文件和库的顺序有依赖性,crt.o这个文件必须被放在链接器命令行中的所有输入文件中的第一个,为了强调这一点,crt.o被更名为crt0.o,表示它是链接时输入的第一个文件。







在crt1.o 中, 包含有代码的运行入口_start:
crt1.o 的前身叫crt0.o, 它的作用是作为连接的首个模块。
为了实现C++的全局构造和析构。改进crt0.o 为crt1.o
运行库在目标文件后引入了.init和.finit段,
.init在main函数前运行
.finit在main函数后运行
链接器将所有目标文件的init段和finit段合并,并产生两个函数:_init()和_finit()。
.init段,.finit 段需要的一些辅助代码,分别位于crti.o和crtn.o。
开始是来自crti.o的,而末尾是来自crtn.o的,中间才是真正程序的全局构造或者析构函数,
也就是说程序的全局构造和析构仅仅是_init和_finit的中间部分.

_start 函数调用: __libc_start_main 函数
__libc_start_main 会调用 __libc_csu_init, __libc_csu_fini,及main 函数
简单表示为如下:
__libc_start_main (main,__libc_csu_init,__libc_csu_fini)
__libc_csu_init, 负责调用_init()
__libc_csu_fini, 负责调用_finit()

glic只是一个c语言库, crti.o和crtn.o只是提供了main之前和之后执行代码的机制,
真正C++全局构造和析构是由crtbegin.o和crtend.o实现的。
GCC是C++的真正实现者。这两个文件是用于配合glibc实现C++全局构造和析构的。

构造过程:
 _start-->__lib_start_main-->__libc_csu_init-->_init--> __do_global_ctors
析构过程: 执行与构造相反的过程


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Farmwang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值