首页 > 编程语言 >《程序员的自我修养》学习笔记——ELF 文件结构介绍【第二弹】

《程序员的自我修养》学习笔记——ELF 文件结构介绍【第二弹】

时间:2023-03-03 13:46:53浏览次数:35  
标签:文件 函数 符号 ELF 程序员 修养 字符串 链接

ELF 文件结构介绍

image

文件头

以 ELF 文件64位版本为例:

image

image

e_ident 【ELF魔数 16byte】

  • 1-4字节:ELF 文件都必须相同的标识码,分别为 0x7F,0x45,0x4C,0x46
  • 第5字节:程序位数(0x01表示32位,0x02表示64位)
  • 第6字节:规定该ELF文件是大端还是小端(0x01表示小端,0x02表示大端)
  • 第7字节:规定该ELF文件版本号(一般为1,ELF标准自1.2版本后就未更新了)
  • 后面9个字节ELF标准未定义,一般填0。

e_type 【文件类型】

image

e_machine 【机器类型,表示该ELF文件的平台属性】

image

段表

段表描述了ELF文件各个段的信息。(比如每个段的段名、长度,在文件中的偏移、读写权限及段的其他属性)

image

重定位表

链接器在处理可重定位文件时,需要对其中某些部位进行重定位,即代码段和数据段中那些对绝对位置引用的地方。

这些重定位信息都记录在重定位表中。(如.rel.text 是针对 .text段的重定位表)

字符串表

ELF文件中用到了很多字符串,比如段名、变量名等。因为字符串的长度往往是不确定的,所以用固定的结构来表示它比较困难。

很常见的做法是把字符串集中起来存放到一个表,然后使用字符串在表中的偏移来引用字符串。【字符串表,常见的段名为 .strtab】【段表字符串表 .shstrtab】

从上面也可以知道,只分析ELF文件头,就可以得到段表和段表字符串表的位置,从而可以解析整个ELF文件。

符号表

在链接中,可重定向文件之间的相互拼合实际上是对地址的引用,即对函数和变量的地址的引用。我们将函数和变量统称为符号(Symbol),函数名和变量名就是符号名。

链接过程中很关键的一部分就是符号的管理,每一个目标文件都会有一个相应的符号表(记录了可重定向文件中所用到的所有符号)。

每个定义的符号都有对应的值,对于变量和函数而言,符号值就是它们的地址

ELF 文件中的符号表往往是文件的一个段,段名一般叫".symtab"(静态链接)。动态链接中同样有一个段叫 动态符号表 ".dynsym"

image

st_name 【符号名】

st_info 【符号类型和绑定信息】

st_shndx 【符号所在段】

st_value 【符号值】

st_size 【符号大小】

image

Num Value Size Type
符号表数组的下标 符号值 符号大小 符号类型
Bind Vis Ndx Name
绑定信息 C/C++中暂未使用 该符号所属的段 符号名称

相关补充

特殊符号

当我们使用 Id 作为链接器来链接生产可执行文件时, 它会为我们定义很多特殊的符号,这些符号并没有在你的程序中定义,但是你可以直接声明并且引用它,我们称之为特殊符号。链接器会在将程序最终链接成可执行文件的时候将其解析成正确的值,注意, 只有使用 Id 链接生产最终可执行文件的时候这些符号才会存在。

几个很具有代表性的特殊符号如下:

  • __executable_start, 该符号为程序起始地址。(程序的最开始的地址)
  • _etexl 或 etext , 该符号为代码段结束地址, 即代码段最末尾的地址。
  • _end 或 end, 该符号为程序结束地址。

符号修饰与函数签名

众所周知, 强大而又复杂的C++拥有类、 继承、 虚机制、 重载 、 命名空间等特性, 它们使得符号管理更为复杂。 为了支持 C++这些复杂的特性,人们发明了符号修饰( Name Decoration)。

函数签名 (Function Signature):包含了一个函数的信息, 包括函数名 、 它的参数类型、 它所在的类和名称空间及其他信息。

函数签名用于识别不同的函数,就像签名用于识别不同的人一样,函数的名字只是函数签名的一部分 。

image

image

留爪,暂过【具体命名规则,当前知道有这么一个东西即可】

标签:文件,函数,符号,ELF,程序员,修养,字符串,链接
From: https://www.cnblogs.com/Only-xiaoxiao/p/17174111.html

相关文章

  • 一个程序员的成功故事:从开源工具到 75 亿美元的软件帝国
    一个程序员的成功故事:从开源工具到75亿美元的软件帝国InfoQ​已认证帐号​关注 12人赞同了该文章作者|SanjayPriyadarshi译者|核子可乐......
  • 前端已死?我看未必,但「低代码」已剑指前端程序员
    本文笔者会从以下几个方面分享,希望能够帮助正在迷茫的前端小伙伴提供一点思路!逛技术博客不局限框架全栈工程师兴起关注前沿写技术文章录制前端视频总......
  • how golang build itself?
    howgolangbuilditself?https://www.reddit.com/r/golang/comments/vbibey/is_golang_compiler_open_source_from_noob/?sort=confidence"Thefirstgocompilerswer......
  • 从菜鸟程序员到高级架构师,竟然是因为这个字final
    final实现原理简介final关键字,实际的含义就一句话,不可改变。什么是不可改变?就是初始化完成之后就不能再做任何的修改,修饰成员变量的时候,成员变量变成一个常数;修饰方法的......
  • 从菜鸟程序员到高级架构师,竟然是因为这个字final
    final实现原理简介final关键字,实际的含义就一句话,不可改变。什么是不可改变?就是初始化完成之后就不能再做任何的修改,修饰成员变量的时候,成员变量变成一个常数;修饰方法的时......
  • 考研失败,加入国企当程序员,真香!
    大家好,这里是程序员晚枫,今天分享一位读者的投稿~有想投稿的朋友,可以后台联系我。下面是正文。最近考研出成绩了,大家考得怎么样?分享一个自己考研失败后,入职国企的故事。1......
  • VideoMAE Masked Autoencoders are Data-Efficient Learners for Self-Supervised Vid
    0.前言相关资料:arxivgithub论文解读(知乎,CSDN)论文基本信息:领域:视频自监督表示学习发表时间:NeurIPS2022(2022.3.23)1.针对的问题视频存......
  • 程序员好书推荐
    <<凤凰项目>><<独角兽项目>>读后感:凤凰项目是一本不错的书,读了一小半,情节跌宕起伏,犹如置身于大厂996开发环境.能感受到主人公压力之大,但仍能果断处理,临危不......
  • 程序员适合创业吗?
    大家好,我是良许。从去年12月开始,我已经在视频号、抖音等主流视频平台上连续更新视频到现在,并得到了不错的评价。每个视频都花了很多时间精力用心制作,欢迎大家关注哦~......
  • #yyds干货盘点# LeetCode程序员面试金典:珠玑妙算
    题目:珠玑妙算游戏(thegameofmastermind)的玩法如下。计算机有4个槽,每个槽放一个球,颜色可能是红色(R)、黄色(Y)、绿色(G)或蓝色(B)。例如,计算机可能有RGGB4种(槽1为红色,槽2、3为绿......