操作系统加载动态链接库原理概述

问题来源一个同事编译工程时报错,提示一个so找不到,原因是可执行程序依赖的一个动态库文件依赖了一个旧版本的so动态库,当时的理解是可执行程序是根据符号来寻找动态库,按照这个思路可执行文件中是不包含依赖的动态库名字信息的,但是后续通过学习发现这个理解是错误的,以linux为例,elf可执行文件中的.dynamic段中是包含依赖的动态库名字信息。

那么动态库是如何生效的呢?

以静态库为例,由于静态库是与用户代码编译到一个文件(即可执行文件中),在编译阶段就完成了调用函数的地址替换工作,即函数调用、变量等都需要在程序执行之前替换成内存地址,由于静态库是和用户代码编译到一起,所以在编译阶段就可以将完成这个替换工作。

回到动态链接库,由于他是独立的,所以在加载可执行程序、动态链接库后,进入程序入口函数前要完成类似静态链接库在编译阶段完成的事情。就是要将用户代码中调用的动态库中的函数的地方替换成

动态库内存的地址,这里并不是简单的替换,由于动态库和可执行程序的代码段是不允许修改的,只能通过数据段来完成这个功能,这里不进行展开。

详情参考:http://mp.ofweek.com/ee/a256714588257

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值