ELF动态库加载技术

库用于将相似函数打包在一个单元中。Linux支持两种类型的库:静态库(在编译时静态绑定到程序)和动态库(在运行时绑定到程序)。Linux系统使用的动态库是ELF格式,后缀名为so

1 加载

动态库内部划分为段,段分为不同的类型:

  •  PT_LOAD段:包含代码或数据,是需要被映射到内存中的,每个段有不同的访问权限(读、些、执行);

  • PT_DYNAMIC段:包含动态链接信息,如符号表、重定位表、引用的其他库等。

其他段类型暂不说明。

加载器将库文件第一个PT_LOAD段和最后一个PT_LOAD段之间的内容映射到一段连续的内存地址空间(好处是任意代码和数据的相对地址固定),其首地址称为基地址(如图)。

库的加载只是把文件内容映射到内存地址,但没有真正读取文件数据,在发生内存缺页异常时才由操作系统读入对应的文件数据到内存。延迟读取文件可以加快库的加载速度。

1.1 预链接

一般来说,映射的基地址是不固定的,但如果动态库使用了预链接(prelink技术,则会被映射到预定的地址(保存在文件上)。如果预定的地址范围已经被占用了,则加载失败(Androidlinker是这样,其他加载器可能不同)。Prelink的好处是简化重定位,加快加载速度。

2 重定位

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值