阅读记录——Before starting the program

《C语言编程透视》 http://tinylab.gitbooks.io/cbook

动态链接器

ELF文件的节区头部表包含了 解释器.interp 节区,该节区指定的该ELF在被执行时使用的动态链接器的绝对路径/lib/ld-linux.so.2。

当exec 启动ELF时,系统首先加载/lib/ld-linux.so.2,为其创建内存映像,然后把控制权交给 ld-linux ,之后 ld-linux 负责为可执行程序提供运行环境,负责解释程序的运行。这ld-linux 在中间执行的动作包括:

1、将可执行文件代码段数据段等map到进程映像中;(可执行文件搜索路径PATH)
2、把共享目标代码段数据段等map到进程映像中;(共享库搜索: 执行文件中的.dynamic给出共享库名 + LD_LIBRARY_PATH指定搜索路径 )
3、为可执行文件和它的动态链接库执行重定位操作;(根据动态库的加载方式,LD_BIND_NOW-在此刻执行,或者, LAZY_MODE-在使用到具体符号时再进行重定位)
4、关闭用来读入可执行文件的文件描述符,如果动态链接程序收到过这样的文件描述符的话;
5、将控制转交给程序,使得程序好像从 exec() 直接得到控制

重定位

重定位涉及以下三个表

过程链接表plt process link table
全局偏移表got global offset table
重定位表

对于未定位的符号,在引用的地方,首先跳转到plt表中,该表首先去查询got表(由于还未定位此时got表中没有真实的符号偏移地址),此时got表指定的地址将跳转回plt表,在plt表中执行两次push重定位相关信息后,将控制权交给链接器,链接器根据栈中的信息和重定位表,查询到真实符号的地址信息,然后将该信息重新填回got表中,这样下次再次引用的时候,就可以直接找到对应的符号地址。具体细节参考C语言编程透视》

你可能感兴趣的:(阅读记录——Before starting the program)