问题来源一个同事编译工程时报错,提示一个so找不到,原因是可执行程序依赖的一个动态库文件依赖了一个旧版本的so动态库,当时的理解是可执行程序是根据符号来寻找动态库,按照这个思路可执行文件中是不包含依赖的动态库名字信息的,但是后续通过学习发现这个理解是错误的,以linux为例,elf可执行文件中的.dynamic段中是包含依赖的动态库名字信息。
那么动态库是如何生效的呢?
以静态库为例,由于静态库是与用户代码编译到一个文件(即可执行文件中),在编译阶段就完成了调用函数的地址替换工作,即函数调用、变量等都需要在程序执行之前替换成内存地址,由于静态库是和用户代码编译到一起,所以在编译阶段就可以将完成这个替换工作。
回到动态链接库,由于他是独立的,所以在加载可执行程序、动态链接库后,进入程序入口函数前要完成类似静态链接库在编译阶段完成的事情。就是要将用户代码中调用的动态库中的函数的地方替换成
动态库内存的地址,这里并不是简单的替换,由于动态库和可执行程序的代码段是不允许修改的,只能通过数据段来完成这个功能,这里不进行展开。