ELF program/section segment解析
ELF program/section segment解析
- 1 elf program segment
- 1.1 elf program header
- 1.2 ELF32和ELF64示例
- 1.2.1 ELF32 program segment
- 1.2.2 ELF64 program segment
- 1.3 elf program segment数据流向图
- 2 elf section
- 2.1 eld section header
- 2.2 ELF32和ELF64示例
- 2.2.1 ELF32 section
- 2.2.2 ELF64 section
- 2.3 elf section数据流向图
在linux remoteproc驱动中elf解析函数实现分析文章中介绍了在linux remoteproc驱动中对elf文件各个不同类型header parse的函数以及对应的定义。
在该文中则重点解释program segment的含义以及对应数据处理。
1 elf program segment
1.1 elf program header
/* These constants define the permissions on sections in the programheader, p_flags. */
#define PF_R 0x4
#define PF_W 0x2
#define PF_X 0x1typedef struct elf32_phdr{Elf32_Word p_type;Elf32_Off p_offset;Elf32_Addr p_vaddr;Elf32_Addr p_paddr;Elf32_Word p_filesz;Elf32_Word p_memsz;Elf32_Word p_flags;Elf32_Word p_align;
} Elf32_Phdr;typedef struct elf64_phdr {Elf64_Word p_type;Elf64_Word p_flags;Elf64_Off p_offset; /* Segment file offset */Elf64_Addr p_vaddr; /* Segment virtual address */Elf64_Addr p_paddr; /* Segment physical address */Elf64_Xword p_filesz; /* Segment size in file */Elf64_Xword p_memsz; /* Segment size in memory */Elf64_Xword p_align; /* Segment alignment, file & memory */
} Elf64_Phdr;
1.2 ELF32和ELF64示例
1.2.1 ELF32 program segment
以test.elf为例来分析
Offset表示对应program segment数据在elf文件中的偏移地址PhysAddr表示要将该program segment的数据拷贝到的物理地址FileSiz表示当前program segment在elf文件中占的大小MemSiz表示当前program segment在对应bin文件中占的大小Flg表示当前program segment的属性Align表示当前program segment的对齐大小
$ readelf -lW test.elf Elf file type is EXEC (Executable file)Entry point 0x0There are 6 program headers, starting at offset 52Program Headers:Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg AlignEXIDX 0x09262c 0x1016262c 0x1016262c 0x00008 0x00008 R 0x4LOAD 0x010000 0x00000000 0x00000000 0x00440 0x00440 RW 0x10000LOAD 0x020000 0x10000000 0x10000000 0x00800 0x00800 R E 0x10000LOAD 0x030000 0x10100000 0x10100000 0x62638 0x62638 R E 0x10000LOAD 0x092740 0x10172740 0x10172740 0x0900c 0x5d158a0 RW 0x10000LOAD 0x000000 0xa0000000 0xa0000000 0x00000 0x04100 RW 0x10000Section to Segment mapping:Segment Sections...00 .ARM.exidx 01 .reset .rom 02 .cpu_vectors 03 .init .text .fini .rodata .ARM.exidx .eh_frame 04 shell_cmd .data .init_array .fini_array .init_array.00000 .datasafe .bss .stack .heap 05 .ram_mpu $
1.2.2 ELF64 program segment
以linux编译生成的vmlinux为例:其一共包含5个program segments;
Offset表示对应program segment数据在elf文件中的偏移地址PhysAddr表示要将该program segment的数据拷贝到的物理地址FileSiz表示当前program segment在elf文件中占的大小MemSiz表示当前program segment在对应bin文件中占的大小Flg表示当前program segment的属性Align表示当前program segment的对齐大小
$ readelf -lW vmlinux Elf file type is DYN (Shared object file)
Entry point 0xffff800008000000
There are 5 program headers, starting at offset 64Program Headers:Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg AlignLOAD 0x010000 0xffff800008000000 0xffff800008000000 0xd2c000 0xd2c000 RWE 0x10000LOAD 0xd40000 0xffff800008d40000 0xffff800008d40000 0x0588dc 0x0588dc R E 0x10000LOAD 0xda0000 0xffff800008da0000 0xffff800008da0000 0x397808 0x43ea24 RW 0x10000NOTE 0xd3aa50 0xffff800008d2aa50 0xffff800008d2aa50 0x000054 0x000054 R 0x4GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW 0x10Section to Segment mapping:Segment Sections...00 .head.text .text .got.plt .rodata __ksymtab __ksymtab_gpl __ksymtab_strings __param __modver __ex_table .notes .hyp.rodata 01 .init.text .exit.text .altinstructions 02 .init.data .data..percpu .hyp.data..percpu .hyp.reloc .rela.dyn .data __bug_table .mmuoff.data.write .mmuoff.data.read .bss 03 .notes 04
$
1.3 elf program segment数据流向图

2 elf section
2.1 eld section header
typedef struct elf32_shdr {Elf32_Word sh_name;Elf32_Word sh_type;Elf32_Word sh_flags;Elf32_Addr sh_addr;Elf32_Off sh_offset;Elf32_Word sh_size;Elf32_Word sh_link;Elf32_Word sh_info;Elf32_Word sh_addralign; Elf32_Word sh_entsize;
} Elf32_Shdr;typedef struct elf64_shdr {Elf64_Word sh_name; /* Section name, index in string tbl */Elf64_Word sh_type; /* Type of section */Elf64_Xword sh_flags; /* Miscellaneous section attributes */Elf64_Addr sh_addr; /* Section virtual addr at execution */Elf64_Off sh_offset; /* Section file offset */Elf64_Xword sh_size; /* Size of section in bytes */Elf64_Word sh_link; /* Index of another section */Elf64_Word sh_info; /* Additional section information */Elf64_Xword sh_addralign; /* Section alignment */Elf64_Xword sh_entsize; /* Entry size if section holds table */
} Elf64_Shdr;
2.2 ELF32和ELF64示例
2.2.1 ELF32 section
以test.elf为例来分析
Off表示对应section数据在elf文件中的偏移地址Addr表示要将该section的数据拷贝到的物理地址Size表示当前section的大小Flg表示当前program segment的属性Type表示当前section的类型Name表示当前section的名字Flg表示当前section的属性
$ readelf -SW test.elf
There are 23 section headers, starting at offset 0x9b894:Section Headers:[Nr] Name Type Addr Off Size ES Flg Lk Inf Al[ 0] NULL 00000000 000000 000000 00 0 0 0[ 1] .reset PROGBITS 00000000 010000 000040 00 A 0 0 1[ 2] .rom PROGBITS 00000100 010100 000340 00 WA 0 0 1[ 3] .ram_mpu NOBITS a0000000 0a0000 004100 00 WA 0 0 1[ 4] .cpu_vectors PROGBITS 10000000 020000 000800 00 AX 0 0 4[ 5] .init PROGBITS 10100000 030000 00000c 00 AX 0 0 4[ 6] .text PROGBITS 10100010 030010 0555c0 00 AX 0 0 16[ 7] .fini PROGBITS 101555d0 0855d0 00000c 00 AX 0 0 4[ 8] .rodata PROGBITS 101555e0 0855e0 00d04c 00 A 0 0 8[ 9] .ARM.exidx ARM_EXIDX 1016262c 09262c 000008 00 AL 6 0 4[10] .eh_frame PROGBITS 10162634 092634 000004 00 A 0 0 4[11] shell_cmd PROGBITS 10172740 092740 0000f0 00 WA 0 0 32[12] .data PROGBITS 10172830 092830 004780 00 WA 0 0 16[13] .init_array INIT_ARRAY 10176fb0 096fb0 000004 04 WA 0 0 4[14] .fini_array FINI_ARRAY 10176fb4 096fb4 000004 04 WA 0 0 4[15] .init_array.00000 INIT_ARRAY 10176fb8 096fb8 000004 04 WA 0 0 4[16] .datasafe PROGBITS 10176fbc 096fbc 004790 00 WA 0 0 1[17] .bss NOBITS 1017b750 09b74c 07c888 00 WA 0 0 16[18] .stack NOBITS 101f7fe0 09b74c 090000 00 WA 0 0 1[19] .heap NOBITS 10287fe0 09b74c 5c00000 00 WA 0 0 1[20] .comment PROGBITS 00000000 09b74c 000045 01 MS 0 0 1[21] .ARM.attributes ARM_ATTRIBUTES 00000000 09b791 000035 00 0 0 1[22] .shstrtab STRTAB 00000000 09b7c6 0000cb 00 0 0 1
Key to Flags:W (write), A (alloc), X (execute), M (merge), S (strings), I (info),L (link order), O (extra OS processing required), G (group), T (TLS),C (compressed), x (unknown), o (OS specific), E (exclude),y (purecode), p (processor specific)
$
2.2.2 ELF64 section
以linux的vmlinux为例来分析
Off表示对应section数据在elf文件中的偏移地址Addr表示要将该section的数据拷贝到的物理地址Size表示当前section的大小Flg表示当前program segment的属性Type表示当前section的类型Name表示当前section的名字Flg表示当前section的属性
$ readelf -SW vmlinux
There are 40 section headers, starting at offset 0xd59a938:Section Headers:[Nr] Name Type Address Off Size ES Flg Lk Inf Al[ 0] NULL 0000000000000000 000000 000000 00 0 0 0[ 1] .head.text PROGBITS ffff800008000000 010000 000040 00 AX 0 0 4[ 2] .text PROGBITS ffff800008010000 020000 a63d60 08 AX 0 0 65536[ 3] .got.plt PROGBITS ffff800008a73d60 a83d60 000018 08 WA 0 0 8[ 4] .rodata PROGBITS ffff800008a80000 a90000 25af18 00 WA 0 0 4096[ 5] __ksymtab PROGBITS ffff800008cdaf18 ceaf18 00d374 00 A 0 0 4[ 6] __ksymtab_gpl PROGBITS ffff800008ce828c cf828c 00fe10 00 A 0 0 4[ 7] __ksymtab_strings PROGBITS ffff800008cf809c d0809c 02e361 01 AMS 0 0 1[ 8] __param PROGBITS ffff800008d26400 d36400 0028a0 00 A 0 0 8[ 9] __modver PROGBITS ffff800008d28ca0 d38ca0 000318 00 WA 0 0 8[10] __ex_table PROGBITS ffff800008d28fb8 d38fb8 001a98 00 A 0 0 8[11] .notes NOTE ffff800008d2aa50 d3aa50 000054 00 A 0 0 4[12] .hyp.rodata PROGBITS ffff800008d2b000 d3b000 001000 00 WA 0 0 8[13] .init.text PROGBITS ffff800008d40000 d40000 03fcf4 00 AX 0 0 4[14] .exit.text PROGBITS ffff800008d7fcf4 d7fcf4 0031c8 00 AX 0 0 4[15] .altinstructions PROGBITS ffff800008d82ebc d82ebc 015a20 00 A 0 0 1[16] .init.data PROGBITS ffff800008da0000 da0000 013298 00 WA 0 0 256[17] .data..percpu PROGBITS ffff800008db4000 db4000 009b58 00 WA 0 0 64[18] .hyp.data..percpu PROGBITS ffff800008dbe000 dbe000 000ed0 00 WA 0 0 16[19] .hyp.reloc PROGBITS ffff800008dbeed0 dbeed0 000060 00 A 0 0 4[20] .rela.dyn RELA ffff800008dbef30 dbef30 1fa280 18 A 37 0 8[21] .data PROGBITS ffff800008fc0000 fc0000 162b20 00 WA 0 0 4096[22] __bug_table PROGBITS ffff800009122b20 1122b20 013e18 00 WA 0 0 4[23] .mmuoff.data.write PROGBITS ffff800009137000 1137000 000018 00 WA 0 0 2048[24] .mmuoff.data.read PROGBITS ffff800009137800 1137800 000008 00 WA 0 0 8[25] .bss NOBITS ffff800009138000 1137808 0a6a24 00 WA 0 0 4096[26] .debug_aranges PROGBITS 0000000000000000 1137810 01f600 00 0 0 16[27] .debug_info PROGBITS 0000000000000000 1156e10 8f735c0 00 0 0 1[28] .debug_abbrev PROGBITS 0000000000000000 a0ca3d0 449e7e 00 0 0 1[29] .debug_line PROGBITS 0000000000000000 a51424e f522ac 00 0 0 1[30] .debug_frame PROGBITS 0000000000000000 b466500 261300 00 0 0 8[31] .debug_str PROGBITS 0000000000000000 b6c7800 29f3dc 01 MS 0 0 1[32] .debug_ranges PROGBITS 0000000000000000 b966be0 000230 00 0 0 16[33] .debug_line_str PROGBITS 0000000000000000 b966e10 010dda 01 MS 0 0 1[34] .debug_loclists PROGBITS 0000000000000000 b977bea 152ec46 00 0 0 1[35] .debug_rnglists PROGBITS 0000000000000000 cea6830 2e8174 00 0 0 1[36] .comment PROGBITS 0000000000000000 d18e9a4 000045 01 MS 0 0 1[37] .symtab SYMTAB 0000000000000000 d18e9f0 26caa8 18 38 85372 8[38] .strtab STRTAB 0000000000000000 d3fb498 19f2f0 00 0 0 1[39] .shstrtab STRTAB 0000000000000000 d59a788 0001ab 00 0 0 1
Key to Flags:W (write), A (alloc), X (execute), M (merge), S (strings), I (info),L (link order), O (extra OS processing required), G (group), T (TLS),C (compressed), x (unknown), o (OS specific), E (exclude),p (processor specific)
$
2.3 elf section数据流向图
对于elf section的数据在boot阶段的流向是按照从elf文件的offset处,按照size大小去拷贝数据到addr的内存处,当各个section拷贝完成之后即可以触发复位操作,启动对应的core。
相关文章:
ELF program/section segment解析
ELF program/section segment解析 1 elf program segment1.1 elf program header1.2 ELF32和ELF64示例1.2.1 ELF32 program segment1.2.2 ELF64 program segment 1.3 elf program segment数据流向图 2 elf section2.1 eld section header2.2 ELF32和ELF64示例2.2.1 ELF32 secti…...
【golang】库源码文件
库源码文件是不能被直接运行的源码文件,它仅用于存放程序实体,这些程序实体可以被其他代码使用(只要遵从Go语言规范的话)。 这里的“其他代码”可以与被使用的程序实体在同一个源码文件内,也可以在其他源码文件&#x…...
网络安全(黑客)常用工具(附配套资料+工具安装包)
几十年来,攻击方、白帽和安全从业者的工具不断演进,成为网络安全长河中最具技术特色的灯塔,并在一定程度上左右着网络安全产业发展和演进的方向,成为不可或缺的关键要素之一。 话不多说,2022年全球白帽常用工具排行榜…...
WebDAV之π-Disk派盘+Joplin
Joplin是一个优秀的开源笔记,可以组织到笔记本中的大量笔记和文本编辑器中进行复制,标记和修改。支持Evernote的笔记直接导入到Joplin应用程序中。Joplin还支持各种云服务同步,包括Dropbox、OneDrive、WebDAV或文件系统,方便对其进行检查、备份和移动。该应用程序可用于Win…...
Unity-UGUI优化策略
界面出栈规则: 界面目录导航、策划界面回退需求造成界面套娃问题,夹带一系列层级问题,应该和策划进行友好沟通,避免界面不合理的出栈入栈规则 overdraw: 尽量减少同屏 半透明物体渲染 Unity 之 UGUI优化(…...
【练】Linux中用共用体(联合体)的方式,判断本机的字节序
方法一:共用体 #include <stdio.h> union Byte {unsigned int a;char c; }; int main(int argc, const char *argv[]) {union Byte endianness;endianness.a0x87654321;printf("endianness.c%#x\n",endianness.c); if(0x21 endianness.c)pr…...
WebRTC | 音视频直播客户端框架
端到端通信互动技术可分解为以下几个技术难点:客户端技术、服务器技术、全球设备网络适配技术和通信互动质量监控与展示技术。 一、音视频直播 音视频直播可分成两条技术路线:一条是以音视频会议为代表的实时互动直播;另一条是以娱乐直播为代…...
flutter开发实战-实现marquee根据文本长度显示文本跑马灯效果
flutter开发实战-实现marquee文本跑马灯效果 最近开发过程中需要marquee文本跑马灯效果,这里使用到了flutter的插件marquee 效果图如下 一、marquee 1.1 引入marquee 在pubspec.yaml中引入marquee # 跑马灯效果marquee: ^2.2.31.2 marquee使用 marquee使用也是…...
8.10论文阅读
文章目录 The multimodal MRI brain tumor segmentation based on AD-Net摘要本文方法损失函数 实验结果 max-vit - unet:多轴注意力医学图像分割摘要本文方法实验结果 The multimodal MRI brain tumor segmentation based on AD-Net 摘要 基于磁共振成像(MRI)的多模态胶质瘤…...
【计算机网络笔记】第一章
1、计算机网络定义 计算机网络主要是由一些通用的、可编程的硬件(包含CPU、计算机、手机、智能电器…)互连而成的,而这些硬件并非专门用来实现某一特定目的(例如,传送数据或视频信号)。这些可编程的硬件能…...
开源力量再现,国产操作系统商业化的全新探索
文章目录 1. 开源运动的兴起2. 开源力量的推动3. 国产操作系统的崭露头角3.1 国产操作系统有哪些 4.国产操作系统的商业化探索5.开源力量对国产操作系统商业化的推动 操作系统作为连接硬件、中间件、数据库、应用软件的纽带,被认为是软件技术体系中最核心的基础软件…...
uni-app uView自定义底部导航栏
因项目需要自定义底部导航栏,我把它写在了组件里,基于uView2框架写的(vue2); 一、代码 在components下创建tabbar.vue文件,代码如下: <template><view><u-tabbar :value"c…...
效率指数级提升的Intellij IDEA快捷键集合
温馨提示:全文有18个小技巧,为了阅读体验,可以直接先看文章目录。 1,打开一个文件中的所有方法展示框 CtrlF12 Alt7 2,打开一个类的所有使用位置 AltF7 3,打开一个类在项目使用的位置 CtrlAltF7 4&#…...
TS学习05-泛型
泛型 目的:可重用性 支持当前数据类型,也支持未来的数据类型。 提供灵活的功能 无法创建泛型枚举和泛型命名空间。 function identity(arg: any): any { return arg }function identity<T>(arg: T) : T { return arg}使用any类型会导致这个函数可以…...
windos wsl2 docker unix:///var/run/docker.sock
解决方案 问题如下 rootDESKTOP-VM0J0I4:~# docker ps Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?启动下docker sudo service docker startcsdn 等风来不如迎风去 htp://t.csdn.cn/Gh365...
前端面试经典手写题
1、手写Promise class Promise2 {state "pending";callbacks [];constructor(fn) {fn(this.resolve.bind(this), this.reject.bind(this));}resolve(result) {if (this.state ! "pending") return;this.state "fullFilled";nextTick(() > …...
Tomcat 部署及优化
Tomcat概述 Tomcat 是 Java 语言开发的,Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,是 Apache 软件基金会的 Jakarta 项目中的一个核心项目,由 Apache、Sun 和其他一些公司及个人共同开发而成。在中小型系统和并发访问用户不是很…...
Selenium入门详细教程+实例演示
目录 1.Selenium概述 1.1什么是Selenium 1.2Selenium的优势 1.3Selenium WebDriver原理 2.Selenium环境搭建 3.Selenium 简单示例 4.八大元素定位 4.1定位方式 4.2定位方式的用法 5.Selenium API 5.1WebDriver 常用 API 5.2WebElement 常用 API 5.3代码示例 6.元素等待机…...
ATFX汇评:美国7月CPI数据即将揭晓,市场预期将有所反弹
ATFX汇评:今日20:30,美劳工部将公布7月未季调CPI年率,前值为3%,预期值3.3%;同一时间公布7月未季调核心CPI年率,前值为4.8%,预期值持平;至8月5日当周初请失业金人数也将同时发布&…...
23、springboot日志使用入门-- SLF4J+Logback 实现(springboot默认的日志实现),日志打印到控制台及日志输出到指定文件
springboot日志使用入门 ★ 典型的Spring Boot日志依赖: spring-boot-start.jar -- spring-boot-starter-logging.jar (Spring Boot的日志包)-- logback(core、classic)-- log4j-to-slf4j.jar-- jul-to-slf4j.jar就是springboo…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
DiscuzX3.5发帖json api
参考文章:PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下,适配我自己的需求 有一个站点存在多个采集站,我想通过主站拿标题,采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...
