之前在研究动态连接的时候,原本打算从头到尾分析下linux下动态链接器ld.linux.so的源代码,但是当时工作上比较忙,未能完成这一任务,只写了一篇介绍ld.so自举的blog。
最近打算重新开始这一任务,详细的分析下这份代码。
首先,很多人认为这份代码应该belongs to内核,但是实际上这跟编译一样,属于用户态程序,由glibc提供,核心代码在elf/rtld.c中。
这些代码的理解最好建立在对动态连接的理论知识有一定的了解,不然可能会有些吃力,牛人除外。
这个文件有4个重要的部分,三个函数:_dl_main,_dl_start,_dl_start_final;一个宏RTLD_START。
dl_start已经在上面自举的那篇blog中做了分析,后续将补全另外三个部分。
这个文件的入口从一个宏开始,与平台相关,是一段汇编代码,也即本篇要分析的代码。
#ifdef RTLD_START
RTLD_START
#else
# error "sysdeps/MACHINE/dl-machine.h fails to define RTLD_START"
#endif
对于x86,RTLD_START定义在sysdeps/i386/dl-machine.h和sysdeps/x86_64/dl-machine.h中
以32位系统为例