ELF 文件结构介绍

文件头

以 ELF 文件64位版本为例:

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 【文件类型】

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

段表

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

重定位表

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

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

字符串表

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

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

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

符号表

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

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

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

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

st_name 【符号名】

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

st_shndx 【符号所在段】

st_value 【符号值】

st_size 【符号大小】

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

相关补充

特殊符号

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

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

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

符号修饰与函数签名

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

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

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

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

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

  1. pwn学习日记Day19 《程序员的自我修养》读书笔记

    windows PE/COFF章总结 本章学习了windows下的可执行文件和目标文件格式PE/COFF.PE/COFF文件与ELF文件非常相似,它们都是基于段的结构的二进制文件格式.Windows下 ...

  2. pwn学习日记Day21 《程序员的自我修养》读书笔记

    Linux内核装载ELF过程 (1)bash进程调用fork()系统调用创建一个新的进程 (2)新的进程调用execve()系统调用执行指定的ELF文件,原先的bash进程继续返回等待刚才启动的新进程 ...

  3. pwn学习日记Day20 《程序员的自我修养》读书笔记

    可执行文件的装载与进程 覆盖装入和页映射是两种典型的动态装载方法 进程建立的三步 1.创建一个独立的虚拟地址空间 2.读取可执行文件头,并且建立虚拟空间与可执行文件的映射关系. 3.将CPU的指令寄存 ...

  4. 第八周读书笔记(人月神话X月亮与六便士)——到底什么才是一个程序员的自我修养?

    写了这么久的读书笔记,涉及到问题大多是一些如何把软件工程做好,如何把自己的职业生涯做好.但总感觉逻辑链上缺了一环,亦即:我们为什么要把软件工程做好,我们成为一名优秀的职业生涯的意义到底在于什么?我觉得 ...

  5. gcc ld 链接器相关知识,调试指令(程序员的自我修养----链接、装载与库)

    最近解决一个动态链接上的问题,因为以前从来没有接触过这方面的知识,所以恶补了一下,首先要了解gcc编译指令(makefile),ld链接器的选项(还有连接脚本section指定内存位置),熟悉查看连接 ...

  6. 程序员的自我修养(2)——计算机网络(转) good

    相关文章:程序员的自我修养——操作系统篇 几乎所有的计算机程序,都会牵涉到网络通信.因此,了解计算机基础网络知识,对每一个程序员来说都是异常重要的. 本文在介绍一些基础网络知识的同时,给出了一些高质量 ...

  7. 程序员的自我修养:高效使用Google解决问题

    如果票选近二十年最伟大的发明,我相信搜索引擎肯定会占据一个不容小觑的位置,它不单是一项发明,更是一项成就,最大程度消灭了信息的不平等.既然人人都可以接触到海量的信息,那么衡量信息财富多寡就只剩下技巧这 ...

  8. pwn学习日记Day18 《程序员的自我修养》读书笔记

    知识杂项 obj文件:当前源代码编译成二进制目标文件 exe文件:将.obj文件与库文件.lib等文件链接生成的可执行文件 一个现代编译器的主要工作流程如下: 源程序(source code)→ 预处 ...

  9. 《程序员的自我修养》读书笔记——系统调用、API

        系统调用 程序运行的时候,本身是没有权限访问多少系统资源的.系统资源有限,如果操作系统不进行控制,那么各个程序难免会产生冲突.线程操作系统都将可能产生冲突的系统资源保护起来,阻止程序直接访问. ...

  10. Java程序员的自我修养

    一.自我修养路线图 如图,这是笔者所走的路.且不论这路走的对不对,这个过程中行业环境会影响到你,大可不必钻牛角尖.附上这张图的目的是为了说,如果你想成为一个优秀的程序员,那么你一定要有规划.当然,别想 ...

随机推荐

  1. Nebula Exchange与集群guava版本不一致问题

    1.集群版本 Hadoop 3.1.1.3.1.4.0-315 Hive (version 3.1.0.3.1.4.0-315) Spark 2.3.2.3.1.4.0-315 Scala versi ...

  2. Ribbit Mq 实现延迟消息

    --------------------好记性不如烂笔头--------------------------- windows 环境,使用 rabbit Mq 需要安装, erl   和  rabbi ...

  3. mysql 增加自定义函数

    查看mysql当前是否支持编写自定义 SHOW variables like '%fun%'; 开启自定义函数 set global log_bin_trust_function_creators=1 ...

  4. node 版本管理

    32位版本的node,运行较大的项目,会内存溢出.所以建议安装64位的版本,且运行速度比32位快.node14以下的版本支持node-sass,版本node16以上的不再支持node-sass,而sa ...

  5. Jmeter五、jmeter中的逻辑控制器

    1.simple controller 提供一个块的结构和控制.更方便,更清晰. 嵌套其他的controller 2.loop controller 循环控制器 控制循环次数 可以使用变量 ${__t ...

  6. 【python】第二模块 步骤一 第三课、数据库的基本查询

    第三课.数据库的基本查询 一.课程介绍 1.1 课程介绍 学习目标 数据的简单查询 无条件查询记录,字段的计算和字段的别名 数据的高级查询 数据排序.分页.去除重复记录 数据的有条件查询 条件表达式: ...

  7. vm 16 player安装与网络配置

    1.密钥: FA1M0-89YE3-081TQ-AFNX9-NKUC0 2.安装步骤: xshell6,要先右键管理员运行绿化.bat,再双击.exe 3.一般的虚拟机,需要win上的v8适配器的ip ...

  8. OO课程第二阶段(实验和期中试题)总结Blog2

    OO课程第二阶段(实验和期中试题)总结Blog2 前言:学习OOP课程的第二阶段已经结束了,在此进行对于知识点,题量,难度的个人看法. 学习OOP课程的第二阶段已经结束了,较第一次阶段学习难度加大,学 ...

  9. 如何运用Vue自定义组件以及组件的传值

    Vue自定义组件 引入组件 首先在项目内的components新建.vue文件. 创建完成之后搭建完整的框架.其实就是新建组件,在此之前,需要在VScode中引入一个插件(vue 2 snippets ...

  10. python3GUI--在线小说播放器By:PyQt5(附ui源码)

    目录 一.准备工作 1.PyQt5 2.qtawesome 3.QMediaPlayer 4.LAVFilters 二.预览 1.启动 2.查看小说详情&播放小说 3.搜索后播放 4.动态演示 ...