进程装载时各动态库的.init段的执行顺序

我们知道:
1,每个动态库都有.init段,.init段的代码会在main函数之前执行。我们可以自定义.init函数,例如,
__attribute__ ((constructor))
static void __my_init_func(void)
{
.......
}
2,启动进程时,LD_PRELOAD指定的动态库,会被优先加载(位于进程地址空间的顶端处)。

那么,LD_PRELOAD的动态库,其.init段会被优先执行吗? 答案是否定的!
那么.init函数的执行时机和顺序到底是什么?通过分析uclibc的libdl源码看, 每个动态库的构造函数(.init段),并不是在加载完该动态库就立刻执行的,而是libdl在装载动态库过程中,会把每个init段依次填入一个数组(假设为init_array),当所有依赖库都装载完之后,先根据动态库之间的依赖关系,来对init_array进行重新排序,排完序之后再依次执行。因此,优先加载的动态库,其init段并不一定优先执行!

PC测试验证(因为PC的libdl支持debug模式)后印证了我们的理论分析。注意下面log中的所有标红部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值