当前位置: 首页 > article >正文

elf格式分析和动态库的链接过程

ELF格式, Linux上的可执行可链接的文件格式,一般有四种:可执行文件,共享目标文件也就是库文件,可重定位文件也就是.O文件,coredump文件,程序终止时,进程的地址空间及一些堆栈信息。

ELF的文件结构由ELF文件头,ELF段表,ELF的段组成

ELF文件头:文件类型,版本号,入口地址,段表的偏移地址,段表的大小,段表的数量等。

段表:由段表头和程序头组成

程序头: 记录了多段的简介信息以及每一个段的偏移量,物理地址,虚拟地址,权限,内存大小,标志等。

段表头:相当于每个段的表头构成了一张表。记录了段的名字,段的类型,段的标志,段的类型,段的大小,段的偏移量等。

段的名字记录在字符串表中,所以这里只记录下偏移量即可。

段的类型包括十几种,这个是可以扩展的。

0:无效段,1:程序段(代码段(text segment),初始数据段(data segment), 未初始数据段(bss)) 2:符号表段 3:重定位表段 4:.dynamic动态链接信息段 3.动态链接的符号表段等。

程序段记录了当前程序文件的代码,变量等。

.sysmbol符号表等记录当程序中引用的其他库的代码的函数,变量等

.dynamic动态链接信息段:记录了当前链接器的路径,用来链接其他共享对象的段。

重定位表段记录了符号重定位的一些偏移值。

上面只是一个简介,实际情况可能复杂得多

实际的段表头

实际的程序头:

符号表(symbol table):

每一个elf文件想要用到其他的elf文件时候就要用到符号表(symbol table)中的symbol entry , 一个symbol entry是一个sym结构体,描述了symbol的名字和值。

名字被写到dynamic string段中了,这里记录的偏移索引。值记录了在对应的elf文件中该符号的地址,不过这个地址需要被重定位,如何重定位呢:需要加上该elf文件加载到内存的基地址(base load address),构成了该symbol在内存中的绝对地址。

GOT(global offset table)

GOT是一个数组,存放编译时还没有确定下来地址符号地址。动态连接器会重新修改他们的地址。

PLT(procedure linkage table)

用来辅助连接器重复为符号的一个表,和GOT配合使用。

哈希表和链(hash table and chain)

帮助链接更容易地找到目标符号

动态库地链接过程其实主要分为两个部分,一是动态库加载到内存地过程,二是动态库引用了其他库所涉及到地一个链接的过程,需要对一些动态的符号进行地址重定位计算,再加载到内存中去。

强符号和弱符号:两个强符号重复了,编译器直接报错。一个强符号一个弱符号,编译器先引用强符号,两个弱符号,编译器看哪个弱符号的内存大,引用哪一个。通过_attrabite_(weak)可以声明弱符号。


http://www.kler.cn/a/376244.html

相关文章:

  • 【网安案例学习】字典攻击 Dictionary Attack
  • 代码随想录算法训练营第三十四天 | 01背包问题 416.分割等和子集
  • Vagrant使用教程:创建CentOS 8虚拟机
  • 大模型开发中将企业数据发送给Open AI是否有安全风险?
  • 【动手学强化学习】part6-策略梯度算法
  • FlaskFastAPIgunicornunicorn并发调用
  • Java - 免费图文识别_Java_免费_图片转文字_文字识别_spring ai_spring ai alibaba
  • 群控系统服务端开发模式-应用开发-上传工厂开发
  • PySpark和Hadoop
  • 前端加密解密
  • 基于springboot的社区团购系统设计与实现
  • 【数据结构-邻项消除】力扣2216. 美化数组的最少删除数
  • [STM32]从零开始的IIC协议讲解与设备驱动
  • 【周末推荐】Windows无缝连接iPhone
  • HCIA(ACL)
  • 如何看待长周期项目?
  • GraphQL 与 Elasticsearch 相遇:使用 Hasura DDN 构建可扩展、支持 AI 的应用程序
  • uaGate SI——实现OT与IT的安全连接
  • [Ubuntu] 文件/目录权限更改
  • 【零售和消费品&存货】超市购物车商品检测系统源码&数据集全套:改进yolo11-DySnakeConv
  • C++ [项目] 躺平发育
  • java stream流的使用
  • 使用 firewall-cmd 管理 Linux 防火墙
  • 飞牛NAS docker compose环境下自建远程桌面服务:rustdesk
  • 深度学习:交叉熵损失(Cross Entropy Loss)
  • MySQL、MongoDB 和 SQL Server 的区别