接上文,为了描述清楚文件格式的本质,咱们先从最基本的“段”说起。

程序中最重要的部分就是段(segment)和节(section),它们是真正的程序体,是真真切切的程序资源,所以下面的说明咱们以它们为例。程序中有很多段,如代码段和数据段等,同样也有很多节,段是由节来组成的,多个节经过链接之后就被合并成一个段了,之前咱们有通过实例解释过segment和section之间的关系。

段和节的信息也是用header来描述的,程序头是program header,节头是section header。

程序中段的大小和数量是不固定的,节的大小和数量也不固定,因此需要为它们专门找个数据结构来描述它们,这个描述结构就是程序头表(program header table)和节头表(section header table)。既然程序头表和节头表都称为表,这说明里面存储的是多个程序头program header和多个节头section header的信息,故这两个表相当于数组,数组元素分别是程序头program header和节头section header。再次强调,这两个表是用来将汇总程序头和节头的表,表中元素是头信息。也就是说程序头表(program header table)中的元素全是程序头(program header),而节头表(section header table)中的元素全是节头(section header)。虽然上面是将两个表一块说明的,但表中的元素全是单一的,不会在程序头表中存在节头信息。

在表中,每个成员(数组元素)都统称为条目,即entry,一个条目代表一个段或一个节的头描述信息。对于程序头表,它本质上就是用来描述段(segment)的,所以您也可以称它为段头表。从名字上就能够看出,段等同于程序,所以将描述段信息的表说成program header table,可见“段”才是程序本身的组成部分。

由于程序中段和节的数量不固定,程序头表和节头表的大小自然也就不固定了,而且各表在程序文件中的存储顺序自然也要有个先后,故这两个表在文件中的位置也不会固定。因此,必须要在一个固定的位置,用一个固定大小的数据结构来描述程序头表和节头表的大小及位置信息,这个数据结构便是ELF header,它位于文件最开始的部分,并具有固定大小,一会咱们看elf header的数据结构就知道了。

ELF header是个用来描述各种“头”的“头”,程序头表和节头表中的元素也是程序头和节头,可见,elf文件格式的核心思想就是头中嵌头,是种层次化结构的格式。

一步步编写操作系统 45 linux的elf可执行文件中的段和节相关推荐

  1. 一步步编写操作系统 46 linux的elf可执行文件格式1

    ELF文件格式依然是分为文件头和文件体两部分,只是该文件头相对稍显复杂,类似层次化结构,先用个ELF header从"全局上"给出程序文件的组织结构,概要出程序中其它头表的位置大小 ...

  2. 一步步编写操作系统 32 linux内核获取内存容量的方法

    操作系统是计算机硬件的管家,它不仅要知道自己的安装了哪些硬件,还得给出有效得当的管理措施,按照预定的一套管理策略使硬件资源得到合理的运用.但管理策略只是逻辑上的东西,是操作系统自圆其说的一套管理资源的 ...

  3. 一步步编写操作系统 45 用c语言编写内核2

    在linux下用于链接的程序是ld,链接有一个好处,可以指定最终生成的可执行文件的起始虚拟地址.它是用-Ttext参数来指定的,所以咱们可以执行以下命令完成链接: ld kernel/main.o - ...

  4. 一步步编写操作系统 71 直接操作显卡,编写自己的打印函数71-74

    一直以来,我们在往屏幕上输出文本时,要么利用bios中断,要么利用系统调用,这些都是依赖别人的方法.咱们还用过一个稍微有点独立的方法,就是直接写显存,但这貌似又没什么含量.如今我们要写一个打印函数了, ...

  5. 一步步编写操作系统 69 汇编语言和c语言共同协作 70

    由于有了上一节的铺垫,本节的内容相对较少,这里给大家准备了两个小文件来实例演示汇编语言和c语言相互调用. 会两种不同语言的人,只是掌握了同一件事物的两种表达方式.人在学习一种新语言时,潜意识里是建立了 ...

  6. 一步步编写操作系统 62 函数调用约定

    由于我们要将c语言和汇编语言结合编程啦,所以一定会存在汇编代码和c代码相互调用的问题,有些事情还是要提前交待给大家的,本节就是要给大家说下函数调用规约中的那些事儿. 函数调用约定是什么? 调用约定,c ...

  7. android游戏基址,Android上可执行ELF文件中的段不能有基址

    Android上可执行ELF文件中的段不能有基址 @(Android研究)[android] [TOC] 场景 我使用Android NDK的编译工具交叉编译qemu项目(编译可在Android上运行 ...

  8. 探索ELF可执行文件的“干货”:段头表和段的基本介绍

    可执行文件的数据结构通常都很复杂和繁琐.原因在于程序在加载到内存中执行时需要经过一系列非常复杂的步骤.例如要计算数据或代码被加载到虚拟内存时的位置,计算重定向数值,实现不同代码的链接等. 本节我们一点 ...

  9. 一步步编写操作系统 47 elf格式文件分析实验

    在上一节中,我们讲述了elf格式的部分理论知识,为什么是部分呢?因为我们本着"够用"的原则,只把我们需要了解的部分说完啦.不过,我相信大部分同学仅仅凭上一节中的理论知识还是领悟不到 ...

最新文章

  1. 使用Postman完成接口测试
  2. linux ora01075,操作系统时间被修改导致ORA-01075和ORA-00600[2252]
  3. HTML字体怎么显示,教你如何用CSS来控制网页字体的显示样式
  4. 机器学习认识聚类(KMeans算法)
  5. 【汇编语言】除法(DIV/IDIV)
  6. oracle中定义表类型数据,oracle 定义表字段域的数据类型
  7. Citrix 服务器虚拟化之三十一 XenApp 6.5负载均衡
  8. angular 和 backbone 区别
  9. 软件需求说明书模板1
  10. html转换opml,asp.net下URL网址重写成.html格式、RSS、OPML的知识总结
  11. 西电计算机科学与技术排名,西安电子科技大学王牌专业有哪些及专业排名
  12. 【Day4.4】堵车去暹罗商圈吃午餐
  13. 2018最新vue.js2.0完整视频教程12套
  14. 包含头文件使用 书名号与双引号的区别(直接打符号竟然发表不了,太难了)
  15. chromebook刷机_某些Chromebook无法获得Linux应用。 这是您可以做的
  16. idea企业开发之插件推荐
  17. msf安卓手机木马实战要点整理
  18. panda3d python教程_panda3d学习笔记(一)Hello World
  19. CV-Model【8】:ConvNeXt
  20. 必读|聊聊大数据产品经理

热门文章

  1. SSH整合方案二(不带hibernate.cfg.xml)
  2. 计算机网络——零碎知识点
  3. uva11361数位dp
  4. Mysql找不到mysql.sock怎么办?
  5. js+ asp.Net ajax开发163邮箱效果(列表底色、多选拖动等)--checkBox多选
  6. [Leedcode][JAVA][第209题][长度最小的子数组][滑动窗口][前缀和][二分查找][双指针]
  7. [Leedcode][JAVA][第1248题][统计「优美子数组][找规律]
  8. [Leedcode][JAVA][第460题][LFU]
  9. python群发短信脚本_python实现zabbix发送短信脚本
  10. python变量生命周期_python 变量定义及变量生命周期