前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ELF文件格式

ELF文件格式

作者头像
mingjie
发布于 2022-05-12 02:34:37
发布于 2022-05-12 02:34:37
1.6K00
代码可运行
举报
运行总次数:0
代码可运行

文章目录

  • 源码到可执行文件
  • ELF文件格式
    • ELF File header
    • Program header
    • Section header
  • 工具
  • Symbol Table

源码到可执行文件

linux中四类文件使用ELF文件格式

  • normal executable files
  • relocatable object files
  • core files
  • shared objects.

https://man7.org/linux/man-pages/man5/elf.5.html

1999年86open项目选择ELF作为x86处理器上Unix和类Unix系统的标准二进制文件格式。使用ELF的原因包括:灵活性、可扩展性、对不同字节序格式支持、跨平台支持地址size。

例如这些扩展名的文件一般都是elf格式:.axf, .bin, .elf, .o, .prx, .puff, .ko, .so, and .mod

ELF文件格式

引用wiki的一张图: https://en.wikipedia.org/wiki/Executable_and_Linkable_Format

  • ELF header在文件开始处描述了整个文件的组织
  • Section提供了目标文件的各项信息(如指令、数据、符号表、重定位信息等)
  • Program header table指出怎样创建进程映像,含有每个program header的入口
  • section header table包含每一个section的入口,给出名字、大小等信息。其中Segment与section的关系后面会讲到。

touch头结构:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# hexdump -C /usr/bin/touch | head -5
00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  02 00 3e 00 01 00 00 00  1d 26 40 00 00 00 00 00  |..>......&@.....|
00000020  40 00 00 00 00 00 00 00  90 ec 00 00 00 00 00 00  |@...............|
00000030  00 00 00 00 40 00 38 00  09 00 40 00 1e 00 1d 00  |....@.8...@.....|
00000040  06 00 00 00 05 00 00 00  40 00 00 00 00 00 00 00  |........@.......|

https://en.wikipedia.org/wiki/Executable_and_Linkable_Format

ELF File header

e_ident的16个字节标识是个ELF文件(7F+’E’+’L’+’F’)。 e_type表示文件类型,2表示可执行文件。 e_machine说明机器类别,3表示386机器,8表示MIPS机器。 e_entry给出进程开始的虚地址,即系统将控制转移的位置。 e_phoff指出program header table的文件偏移。 e_phentsize表示一个program header表中的入口的长度(字节数表示)。 e_phnum给出program header表中的入口数目。类似的。 e_shoff,e_shentsize,e_shnum 分别表示section header表的文件偏移,表中每个入口的的字节数和入口数目。 e_flags给出与处理器相关的标志。 e_ehsize给出ELF文件头的长度(字节数表示)。 e_shstrndx表示section名表的位置,指出在section header表中的索引。

Program header

目标文件或者共享文件的program header table描述了系统执行一个程序所需要的段或者其它信息。目标文件的一个段(segment)包含一个或者多个section。Program header只对可执行文件和共享目标文件有意义,对于程序的链接没有任何意义。结构定义如下,可在/usr/include/elf.h中可以找到文件头结构定义:

其中p_type描述段的类型; p_offset给出该段相对于文件开关的偏移量; p_vaddr给出该段所在的虚拟地址; p_paddr给出该段的物理地址; p_filesz给出该段的大小,在字节为单元,可能为0; p_memsz给出该段在内存中所占的大小,可能为0; p_filesze与p_memsz的值可能会不相等。

Section header

目标文件的section header table可以定位所有的section,它是一个Elf64_Shdr结构的数组,Section头表的索引是这个数组的下标。有些索引号是保留的,目标文件不能使用这些特殊的索引。

Section包含目标文件除了ELF文件头、程序头表、section头表的所有信息,而且目标文件section满足几个条件:

  • 目标文件中的每个section都只有一个section头项描述,可以存在不指示任何section的section头项。
  • 每个section在文件中占据一块连续的空间。
  • Section之间不可重叠。
  • 目标文件可以有非活动空间,各种headers和sections没有覆盖目标文件的每一个字节,这些非活动空间是没有定义的。

sh_name指出section的名字,它的值是后面将会讲到的section header string table中的偏移,指出一个以null结尾的字符串。 sh_type是类别。 sh_flags指示该section在进程执行时的特性。 sh_addr指出若此section在进程的内存映像中出现,则给出开始的虚地址。 sh_offset给出此section在文件中的偏移。其它字段的意义不太常用,在此不细述。

文件的section含有程序和控制信息,系统使用一些特定的section,并有其固定的类型和属性(由sh_type和sh_info指出)。

下面介绍几个常用到的section:

  • “.bss”段含有占据程序内存映像的未初始化数据,当程序开始运行时系统对这段数据初始为零,但这个section并不占文件空间。
  • “.data.”和“.data1”段包含占据内存映像的初始化数据。
  • “.rodata”和“.rodata1”段含程序映像中的只读数据。
  • “.shstrtab”段含有每个section的名字,由section入口结构中的sh_name索引值来获取。
  • “.strtab”段含有表示符号表(symbol table)名字的字符串。
  • “.symtab”段含有文件的符号表,在后文专门介绍。
  • “.text”段包含程序的可执行指令。

工具

Main article: GNU Binutils

  • readelf is a Unix binary utility that displays information about one or more ELF files. A free software implementation is provided by GNU Binutils.
  • elfutils provides alternative tools to GNU Binutils purely for Linux.[10]
  • elfdump is a command for viewing ELF information in an ELF file, available under Solaris and FreeBSD.
  • objdump provides a wide range of information about ELF files and other object formats. objdump uses the Binary File Descriptor library as a back-end to structure the ELF data.
  • The Unix file utility can display some information about ELF files, including the instruction set architecture for which the code in a relocatable, executable, or shared object file is intended, or on which an ELF core dump was produced.

Symbol Table

目标文件的符号表包含定位或重定位程序符号定义和引用时所需要的信息。符号表入口结构定义如下,可在/usr/include/elf.h中可以找到文件头结构定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typedef struct elf64_sym {
  Elf64_Word st_name;		/* Symbol name, index in string tbl */
  unsigned char	st_info;	/* Type and binding attributes */
  unsigned char	st_other;	/* No defined meaning, 0 */
  Elf64_Half st_shndx;		/* Associated section index */
  Elf64_Addr st_value;		/* Value of the symbol */
  Elf64_Xword st_size;		/* Associated symbol size */
} Elf64_Sym;
  • st_name包含指向符号表字符串表(strtab)中的索引,从而可以获得符号名。
  • st_value指出符号的值,可能是一个绝对值、地址等。
  • st_size指出符号相关的内存大小,比如一个数据结构包含的字节数等。
  • st_info规定了符号的类型和绑定属性,指出这个符号是一个数据名、函数名、section名还是源文件名;并且指出该符号的绑定属性是local、global还是weak。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-12-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
怎么让联想计算机升级,联想电脑怎么升级win11?联想电脑升级win11的几种方法…
最近刚发布的windows11的消息,但是很多朋友使用联想电脑的朋友不知道怎么升级win11。戴尔电脑升级win11的方法有很多,可以通过win10系统加入WINDOWS 预览体验计划,这样就可以将win10升级到win11系统了,也可以采用自己下载win11镜像用u盘的方式升级到win11系统,下面小编就教大家几种将联想电脑升级win11的方法详细步骤。
全栈程序员站长
2022/08/31
2K0
我在B站学知识之三分钟完成U盘PE启动盘制作与Win11系统安装实践
作者: WeiyiGeek 原文地址: https://www.bilibili.com/read/cv16201487 温馨提示: 如图片显示不出请访问原文查看。
全栈工程师修炼指南
2022/09/29
3.6K0
我在B站学知识之三分钟完成U盘PE启动盘制作与Win11系统安装实践
windows就地升级系统
之前我写了server系统就地升级的文档:https://cloud.tencent.com/developer/article/2356121
Windows技术交流
2024/03/22
2610
Mac + VMware Fusion + Windows 11尝鲜
从有印象接触所谓 “操作系统” 的概念开始,大一就将属于我的第一台电脑(联想G510)换成了Windows 10操作系统,如今Windows 10已经和Windows 7一样,都已成为或将成为过去式了
仙人技术
2021/11/01
3.8K0
Mac + VMware Fusion + Windows 11尝鲜
升级win11显示:此版本的windows不支持该处理器—如何强升win11?
今天的我微信笔记本 msi gp62 mvr 无论是win10升级到win11 还是安装win11都无法安装。显示:
周陆军博客
2024/01/09
2K0
把 Windows 11 装进移动硬盘:Windows 11 To Go
本篇文章聊聊如何制作一个可以“说带走就带走”的 Windows 操作系统,将 Windows11 做成能够放在 U 盘或者移动硬盘里的 WinToGo “绿色软件”。
soulteary
2023/12/06
1.3K0
把 Windows 11 装进移动硬盘:Windows 11 To Go
微软:不是所有电脑都能升级Win11,网友:看我偷梁换柱
TPM指的是可信平台模块 (Trusted Platform Module),一种符合安全标准的芯片,可以为硬件提供安全保护。
量子位
2021/07/19
1.3K0
如何让win11 iso跳过硬件检测,让普通机器也能安装win11
如何让win11 iso跳过硬件检测,让普通机器也能安装win11,网上办法很多,会走很多弯路,这里直接到位
Windows技术交流
2024/04/07
6020
操作系统:Win11首个预览版来了!附升级方法
北京时间6月29日凌晨一点,微软开始向Win10 Dev通道的用户推送Win11预览版更新。本次更新的版本号为10.0.22000.51(co_release)。
小明互联网技术分享社区
2021/07/21
1.4K0
Windows 11 及其安卓子系统折腾记
值此程序员日,记录一下这两天折腾最新的 Windows11 系统及预览发行的安卓子系统(Windows Subsystem for Android)的过程。
独立观察员
2022/12/06
3.5K0
Windows 11 及其安卓子系统折腾记
跨界探索:在苹果系统M系列处理器上安装Windows 11系统的实践经历
描述:在上一篇,文章中,我们介绍了在旧版本苹果MacOS系统安装Windows的方法,当时也是一位同事需要将macOS笔记本安装成为双系统,当时由于是2019年前的型号,所以使用的是BootCamp的方式进行安装;昨天又受另外一个同事所托,需要将苹果笔记本电脑安装一个 Windows 10系统,结果到手后一看系统和处理版本,发现是苹果的 M1 处理器,而苹果的M系列处理器采用的是ARM架构的,不支持64位架构的,要用启动转换助理只能在英特尔芯片上用,所以传统的双系统是无望了,遂Google 上搜索了相关资料,发现有大佬分享了苹果 M1 / M2 处理器安装 Windows 11的方法,是使用虚拟机的方式来进行Windows11/10系统安装,在实践的过程中还是存在一些小坑,为了帮助有同样需要的小伙伴们,就在此记录一下,希望大家多多支持。
全栈工程师修炼指南
2024/05/09
5.7K0
跨界探索:在苹果系统M系列处理器上安装Windows 11系统的实践经历
如何在MacBook M1上无缝使用Win11和MacOS?
2020年,MacBook M1发布后,由于其夸张到离谱的性能表现,苹果又一次在知名度和销量上真正实现了双丰收。
蛮三刀酱
2021/09/07
2.1K0
操作系统:快速安装windows11的图文教程,值得收藏!
今天小编就给大家分享windows11安装步骤详细图文教程介绍,并且该方法不需要U盘就可以完成,十分方便,感兴趣的朋友赶紧来尝试一下吧。
小明互联网技术分享社区
2022/04/07
1.8K0
操作系统:快速安装windows11的图文教程,值得收藏!
如何在MacBook M1上无缝使用Win11和MacOS?
2020年,MacBook M1发布后,由于其夸张到离谱的性能表现,苹果又一次在知名度和销量上真正实现了双丰收。
蛮三刀酱
2022/01/05
2.6K0
如何在MacBook M1上无缝使用Win11和MacOS?
谁会拒绝一台Win11和MacOS无缝切换的MacBook呢?Parallels17极速体验
2020年,MacBook M1发布后,由于其夸张到离谱的性能表现,苹果又一次在知名度和销量上真正实现了双丰收。
Rude3Knife的公众号
2021/09/24
2.5K0
Windows11版本抢鲜体验【VMware详细安装教程 】
新一代 Windows 11系统发布之后,微软也公布了Win 11最低配置要求,具体如下。
互联网-小阿宇
2022/11/21
8700
Windows11版本抢鲜体验【VMware详细安装教程 】
不支持TPM没关系,老电脑轻松安装、激活windows11
2021年6月16日,windows11泄露,整个互联网掀起对windows的热度,2021年6月24日,微软正式召开windows11发布会,2021年6月29日,第一个Windows 11 (Dev 22000.51) (x64) 版本发布。
王忘杰
2022/09/22
1.3K0
不支持TPM没关系,老电脑轻松安装、激活windows11
Windows 11「反苹果设计」决战Mac OS!最强安卓模拟器火药味十足
在成为继苹果后全球第二家市值超过 2 万亿美元的公司后,北京时间昨日晚间,Windows 11 重磅发布。
新智元
2021/07/06
1.6K0
升级,WIN10正在向Apple靠齐
WIN10正式版终于来到了,4月开始我就在体验WIN10预览版了,还存在一些不完善之处,所以这次决定第一时间升级到正式版。WIN10这一次彻头彻尾的在改变自己,向用户展示其“移动为先、云为先”的设计理。 改变从系统的升级和分发方式上开始。 WIN10自身提供了两种安装方式,一种是基于 Windows Insider 的一键升级,傻瓜式操作方法,跟iOS和Mac OS系统的升级方式很相似。第二种则是下载 ISO 镜像文件制作光盘或者启动盘进行安装,这是传统的安装方式,需要先进行文件备份、进入BIOS选择U盘启
罗超频道
2018/04/28
1.3K0
升级,WIN10正在向Apple靠齐
把 Windows 装进 Docker 容器里
本篇文章聊聊如何在 Docker 里运行 Windows 操作系统, Windows in Docker Container(WinD)。
soulteary
2024/03/18
1.4K0
把 Windows 装进 Docker 容器里
推荐阅读
相关推荐
怎么让联想计算机升级,联想电脑怎么升级win11?联想电脑升级win11的几种方法…
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验