进程装载时各动态库的.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中的所有标红部分。

你可能感兴趣的:(ELF)