进程装载时各动态库的.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中的所有标红部分。
发布了28 篇原创文章 · 获赞 21 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章