SOC Boot学习(一)——ELF文件

01 ELF Header组成

纯手搓C++实现读取ELF文件头信息、段表信息和节表信息_c代码实现解析elf文件-CSDN博客

  • elf header
  • programm header table
  • section header table
  • section

02 read elf

#include <iostream>
using namespace std;using ELF64_Addr = uint64_t;
using ELF64_Off = uint64_t;
using ELF64_Half = uint16_t;
using ELF64_Word = uint32_t;
using ELF64_Sword = int32_t;
using ELF64_Xword = uint64_t;
using ELF64_Sxword = int64_t;/* 
e_ident[16]
包含了Maigc Number用于表明这是一个ELF文件,共16字节。	
0~3:前4字节为Magic Number,固定为、'\\0x7f' 'E' 'L' 'F'。
4(EI_CLASS):00为非法文件,01位32位,02为64位。
5(EI_DATA):00为非法数据编码,01为小端序,02为大端序。
6(EI_VERSION):文件版本,固定为01。
7(EI_OSABI):操作系统ABI标识(实际未使用)。
8(EI_ABIVERSION):ABI版本(实际 未使用)。
9~15:对齐填充,无实际意义。
*/typedef struct {unsigned char e_ident[16]; ELF64_Half e_type;  // 可重定位、可执行、共享目标文件ELF64_Half e_machine; // CPU架构ELF64_Word e_version;ELF64_Addr e_entry;ELF64_Off e_phoff;ELF64_Off e_shoff;ELF64_Word e_flags;ELF64_Half e_ehsize;ELF64_Half e_phentsize;ELF64_Half e_phnum;ELF64_Half e_shentsize;ELF64_Half e_shnum;ELF64_Half e_shstrndx;
} ELF64_Ehdr;typedef struct {ELF64_Half p_type;ELF64_Half p_flags;ELF64_Off p_offset;ELF64_Half p_offset;ELF64_Addr p_vaddr;ELF64_Addr p_paddr;ELF64_Xword p_filesz;ELF64_Xword p_memsz;ELF64_Xword p_align;
} ELF64_Phdr;typedef struct {ELF64_Word sh_name;ELF64_Word sh_type;ELF64_Xword sh_flags;ELF64_Addr sh_addr;ELF64_Off sh_offset;ELF64_Xword sh_size;ELF64_Word sh_link;ELF64_Word sh_info;ELF64_Xword sh_addralign;ELF64_Xword sh_entsize;
} ELF64_Shdr;int main() {char filename[10010];cin >> filename;FILE *fp = fopen(filename, "r");if (fp == NULL) {cout << "fail to open file" << endl;exit(0);}ELF64_Ehdr elf_head;int shnum, status;status = fread(&elf_head, sizeof(ELF64_Ehdr), 1, fp);if (status == 0) {cout << "fail to read elf header" << endl;exit(0);}if (elf_head.e_ident[0] != 0x7f ||elf_head.e_ident[1] != 'E' ||elf_head.e_ident[2] != 'L' ||elf_head.e_ident[3] != 'F') {cout << "not a elf file" << endl;exit(0);}printf("程序入口(start标签位置) %#x\\n\\n",elf_head.e_entry);printf("Program header table文件中偏移 %#x\\n",elf_head.e_phoff);printf("Program header table大小 %#x\\n",elf_head.e_phentsize*elf_head.e_phnum);printf("Program header数量 %d\\n\\n",elf_head.e_phnum);printf("Section header table文件中偏移 %#x\\n",elf_head.e_shoff);printf("Section header table大小 %#x\\n",elf_head.e_shentsize*elf_head.e_shnum);printf("Section header数量 %d\\n\\n",elf_head.e_shnum);// 解析Segment Header// 制作Segment Header数组用来存储每一个Segment HeaderELF64_Phdr *phdr = (ELF64_Phdr*)malloc(sizeof(ELF64_Phdr) * elf_head.e_phnum);if (NULL == phdr){printf("phdr malloc failed\\n");exit(0);}// 设置文件偏移量,定位到e_phoffstatus = fseek(fp, elf_head.e_phoff, SEEK_SET);if (0 != status){printf("\\nfaile to fseek\\n");exit(0);}// 读取所有Segment Header 到 phdr, 大小为sizeof(Elf64_Phdr) * 数量status = fread(phdr, sizeof(ELF64_Phdr) * elf_head.e_phnum, 1, fp);if (0 == status){printf("\\nfail to read segment\\n");exit(0);}// 重置指针位置到文件流开头rewind(fp);// 遍历每一个Segment Headerfor (int i = 0; i < elf_head.e_phnum; i++){printf("段首的偏移: %#x\\n", phdr[i].p_offset);printf("段在文件中的大小: %#x\\n", phdr[i].p_filesz);printf("段的运行时虚拟内存地址: %#x\\n", phdr[i].p_vaddr);printf("段在内存中的大小: %#x\\n", phdr[i].p_memsz);printf("\\n");}// 解析Section Header// 制作Section Header数组用来存储每一个Section HeaderELF64_Shdr *shdr = (ELF64_Shdr*)malloc(sizeof(ELF64_Shdr) * elf_head.e_shnum);if (NULL == shdr){printf("shdr malloc failed\\n");exit(0);}// 设置文件偏移量,定位到e_shoffstatus = fseek(fp, elf_head.e_shoff, SEEK_SET);if (0 != status){printf("\\nfaile to fseek\\n");exit(0);}// 读取所有Segment Header 到 phdr, 大小为sizeof(Elf64_Phdr) * 数量status = fread(shdr, sizeof(ELF64_Shdr) * elf_head.e_shnum, 1, fp);if (0 == status){printf("\\nfail to read section\\n");exit(0);}// 重置指针位置到文件流开头rewind(fp);// 读取每个Section的名字// 将fp指针移到字符串表(.shstrtab)内容的偏移位置处fseek(fp, shdr[elf_head.e_shstrndx].sh_offset, SEEK_SET);// e_shstrndx项是字符串表(.shstrtab)的下标// 把这个段的内容全部存储到shstrtab数组里面uint64_t size = shdr[elf_head.e_shstrndx].sh_size; char *shstrtab = (char*) malloc(size);char *temp = shstrtab;// 读取内容status = fread(shstrtab, shdr[elf_head.e_shstrndx].sh_size, 1, fp);if (0 == status){printf("\\nfaile to read\\n");}// 遍历每一个节for (int i = 0; i < elf_head.e_shnum; i++){// temp指针用于定位当前节的名字在.shstrtab节内容中的首地址temp = shstrtab;// shdr[i].sh_name表示这个节名字在(.shstrtab)节内容中的偏移temp = temp + shdr[i].sh_name;printf("节的名称: %s\\n", temp);printf("节首的偏移: %#x\\n", shdr[i].sh_offset);printf("节的大小: %#x\\n", shdr[i].sh_size);printf("节的运行时虚拟内存地址: %#x\\n", shdr[i].sh_addr);printf("\\n");}system("pause");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/16843.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

GOLANG+VUE后台管理系统

1.截图 2.后端工程截图 3.前端工程截图

推荐一款流程图和图表绘制工具:WizFlow Flowcharter Pro

WizFlow Flowcharter是一款易于使用、功能丰富的Windows流程图和图表绘制工具。它允许用户使用超过一百种预定义的形状和箭头定义形状“样式”。您可以将自己的样式保存在图表模板中&#xff0c;以建立自己的绘图方法。WizFlow附带了完整的流程图模板&#xff0c;以帮助您入门。…

fpga spi回环

SPI设备间的数据传输之所以又被称为数据交换,是因为 SPI协议规定一个 SPI设备 不能在数据通信过程中仅仅只充当一个"发送者(Transmitter)“或者"接收者 (Receiver)”.在每个 Clock 周期内,SPI 设备都会发送并接收一个 bit 大小的数据(不管主 设备好还是从设备),相当于…

软间隔支持向量机支持向量的情况以及点的各种情况

软间隔支持向量 ​ 这一节我们要回答的问题是&#xff1f;如何判断一个点是软间隔支持向量机中的支持向量&#xff0c;在硬间隔支持向量机中&#xff0c;支持向量只需要满足一个等式&#xff1a; y i ( w T x i b ) − 1 0 y_i(w^Tx_i b) -1 0 yi​(wTxi​b)−10 ​ 在软间…

界面控件DevExpress Blazor UI v24.1新版亮点 - 全新PDF Viewer等组件

DevExpress Blazor UI组件使用了C#为Blazor Server和Blazor WebAssembly创建高影响力的用户体验&#xff0c;这个UI自建库提供了一套全面的原生Blazor UI组件&#xff08;包括Pivot Grid、调度程序、图表、数据编辑器和报表等&#xff09;。 DevExpress Blazor控件目前已经升级…

defaultdict()语法

一、defaultdict产生的原因&#xff1a; 当我使用普通的字典时&#xff0c;用法一般是dict{},添加元素的只需要dict[element] value即&#xff0c;调用的时候也是如此&#xff0c;dict[element] xxx,但前提是element字典里&#xff0c;如果不在字典里就会报错。 defaultdict的…

[HE phy]

前导码 5G OFDM分为两部分&#xff0c;前导码Legacy preamble和数据data 前导码类型&#xff1a; 其中前导码Legacy preamble分为&#xff1a;Legacy Short Traing (L-STF), L_LTF, L-SIG。 如果数据是HT/VHT/HE&#xff0c;则还有其对应格式的前导码。 各类型作用&#xff…

【matlab】数据类型01-数值型变量(整数、浮点数、复数、二进制和十六进制)

文章目录 一、 整数1.1 整数的最值1.2 大整数1.3 当整数值超过了uint64最大值1.4 和其它类型数值运算 二、 浮点数2.1 双精度和单精度2.2 浮点数的存储2.3 浮点数的最值2.4 浮点数的“四舍五入”2.5 浮点数的算术运算2.6 意外&#xff1a;舍入误差、抵消、淹没和中间转换 三、复…

Tessy学习笔记—requirement(需求)的管理

1&#xff1a;什么是需求 Tessy中的requirement&#xff08;需求&#xff09;是&#xff0c;我们还是跟着Tessy官方的文档&#xff0c;继续学习&#xff0c;打开官方自带的工程Is Value In Range Requirement.project。 按照官方自带的操作手册&#xff0c;导入txt类型的需求…

关于10款PDF编辑工具我的使用体验!!!!!

如今&#xff0c;pdf的使用已经见怪不怪。在我们的工作、学习和生活中都已经离不开PDF文档了。那我么&#xff0c;随之而来的问题也就是我们经常需要对PDF文件进行编辑。市面上已经出现了许多PDF编辑软件。下面&#xff0c;我将与大家分享一下这几款PDF编辑器的个人使用经历。 …

unity小:shaderGraph不规则涟漪、波纹效果

实现概述 在本项目中&#xff0c;我们通过结合 Sine、Polar Coordinates 和 Time 节点&#xff0c;实现了动态波纹效果。以下是实现细节&#xff1a; 核心实现 Sine 波形生成&#xff1a; 使用 Sine 节点生成基本的波形。该节点能够创建周期性变化&#xff0c;为波纹效果提供…

针对gitgitee的使用

1.下载git 链接 打开终端&#xff0c;桌面鼠标右键 2.配置密钥 登录gitee。 设置密钥 查看官方文档 跟着教程 复制最后的输出进行密钥添加 验证是否添加成功 3.创建&连接远程仓库 创建仓库 git终端进行配置 远程仓库克隆到本地 桌面终端clone,克隆他人|自己的仓库到本地…

基于yolov8、yolov5的玉米病害检测识别系统(含UI界面、训练好的模型、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov8、yolov8 SE注意力机制 或 yolov5、yolov5 SE注意力机制 &#xff0c; 直接提供最少两个训练好的模型。模型十分重要&#xff0c;因为有些同学的电脑没有 GPU&#xff0…

省级生活垃圾无害化处理率面板数据(2004-2022年)

生活垃圾无害化处理率是指经过处理的生活垃圾中&#xff0c;达到无害化标准的垃圾所占的比例。这一指标的提高&#xff0c;意味着城市在垃圾处理方面的能力增强&#xff0c;能够有效减少环境污染&#xff0c;提升居民生活质量&#xff0c;同时也是城市可持续发展的重要保障。 …

NTIRE2024 | 修复一切图像RAIM: Restore All Image Model Challenge报告分析

论文/报告地址&#xff1a;NTIRE 2024 Restore Any Image Model (RAIM) in the Wild Challenge 0、写在前面 马上CVPR2024就要开幕&#xff0c;各大挑战赛的排名和详细报告也都出炉。近期留意到这个名字很屌的赛道&#xff0c;修复一切图像的模型&#xff0c;小米的团队的拿了…

【Visual Studio】设置文件目录

打开属性 输出目录&#xff1a;$(SolutionDir)bin\$(Platform)\$(Cinfiguration)\ 中间目录&#xff1a;$(SolutionDir)bin\intermediates\$(Platform)\$(Cinfiguration)\

基于Java的校园菜鸟驿站管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

Photoshop(PS)——人像磨皮

1.新建一个文件&#xff0c;背景为白色&#xff0c;将图片素材放入文件中 2.利用CtrlJ 复制两个图层出来&#xff0c;选择第一个拷贝图层&#xff0c;选择滤镜---杂色---蒙尘与划痕 3.调整一下数值&#xff0c;大概能够模糊痘印痘坑&#xff0c;点击确定。 4.然后选择拷贝2图层…

Yocto - 使用Yocto开发嵌入式Linux系统_13 创建定制层

Creating Custom Layers 除了使用社区或供应商提供的现有图层外&#xff0c;我们还将在本章中学习如何为我们的产品创建图层。此外&#xff0c;我们还将了解如何创建机器定义和分布&#xff0c;并从中获益&#xff0c;从而更好地组织我们的源代码。 In addition to using exist…

第5章-总体设计 5.2 需求转化为规格

5.2 需求转化为规格 1.框式产品&#xff08;1&#xff09;业务规格&#xff0c;这需要满足客户期望、有市场竞争力、颗粒度最合理。&#xff08;2&#xff09;整框规格&#xff0c;包括电源、功耗、散热、可靠性的规格&#xff0c;要保证整款满足环境应用要求。&#xff08;3&a…