已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Elf文件格式:在include/elf.h文件里,定义了elf的文件格式如下:228 #define EI_NIDENT 16229 /liuxs added; Elf32_Half =unsigned short,Elf32_Word=unsigned long./liuxs added ; Elf32_Addr =unsigned long; Elf32_Off =unsigned long230 typedef struct elf32_hdr231 unsigned char e_identEI_NIDENT; /* 魔数和相关信息 */232 Elf32_Half e_type; /* 目标文件类型 */233 Elf32_Half e_machine; /* 硬件体系 */234 Elf32_Word e_version; /* 目标文件版本 */235 Elf32_Addr e_entry; /* Entry point */ /* 程序进入点 */236 Elf32_Off e_phoff; /* 程序头部偏移量 */237 Elf32_Off e_shoff; /* 节头部偏移量 */238 Elf32_Word e_flags; /* 处理器特定标志 */239 Elf32_Half e_ehsize; /* ELF头部长度 */240 Elf32_Half e_phentsize; /* 程序头部中一个条目的长度 */241 Elf32_Half e_phnum; /* 程序头部条目个数 */242 Elf32_Half e_shentsize; /* 节头部中一个条目的长度 */243 Elf32_Half e_shnum; /* 节头部条目个数 */244 Elf32_Half e_shstrndx; /* 节头部字符表索引 */245 Elf32_Eh头部共52个字节以下为示例代码的二进制代码(用hexdum C t1_arm查看,红色部分为代码,前面为标记,汇编代码为ARM下的代码,大端,所以两个字节是颠倒): 00000000 7f 45 4c 46 01 02 01 61 00 00 00 00 00 00 00 00 |.ELF.a.| 00000010 00 02 00 28 00 00 00 01 00 00 80 d0 00 00 00 34 |.(.4| 00000020 00 06 90 f4 00 00 02 02 00 34 00 20 00 03 00 28 |.4. .(| 00000030 00 19 00 16 00 00 00 01 00 00 00 00 00 00 80 00 |.| 前16个字节是属于unsigned char e_identEI_NIDENT,标识ELF的一些信息。00000000-00000003 :7F 45 4C 46 (红色部分为大端显示,需要颠倒) ELF文件以一个magic number开头(7F),接下来是E,L,F这三个字符。00000004:01 这位是标明文件的类型,如果是0为非法,1为32位目标,2为64位目标,当初属于预留的,。在这里为32位目标文件00000005:02这位是处理器的编码方式,01表示高位在前,02表示低位在前,0是非法数据编码,对应ARM下的是大端。00000006:01 这位是头部版本号00000007-0000000f:61 00 00 00 00 00 00 00 00 标记 e_ident 中未使用字节的开始。初始化为 0。0x100x11: 00 02 (为大端格式,后续一样)e_type: 2代表可执行文件,1是可重定位的目标文件(gcc c得到的是这样的文件),而3表示共享目标文件(gcc shared得到的文件如此),同样,0是指未知的目标文件。其它的值含义如下0x12-0x13: 00 283是指Intel 80386结构,据某篇文档说,ia32的结构上这位是必须指定为EM_386的,即值为3。0x28为ARM0x14-0x17: 00 00 00 01 (大端,对应为1)取1为当前版本EV_CURRENT,取0为非法版本EV_NONE0x18-0x1b:00 00 80 d0为程序入口地址,即应用程序最开始执行地址,需要注意的时不会时main,由于编译器链接时会在main之前链接一些其它函数。对应于静态的c程序,入口函数为_start通过以下可以发现,80d0为start函数的起始地址。在glibc-2.3.5/sysdeps/arm/elf/start.S 文件里可以找到_start函数的实现:0x1c-0x1f: 0 00 00 34e_phoff,程序(program)头部偏移量,整好elf头部为52个字节,紧跟在elf头部后面的为程序头描述数据结构。Program header在linux装载此elf文件时需要用到0x20-0x23: 00 06 90 f4e_shoff; 节(section)头部偏移量,从文件的偏移0x0690f4开始,具体作用待后续研究。0x24-0x27: 00 00 02 02e_flags; /* 处理器特定标志 */杂记:.jcr:代表跟java相关的初始化java class registration.ctors This section holds an array of the global constructor function pointers of a program. .dtors This section holds an array of the global destructor function pointers of a program. C +全局对象的初始化函数指针列表.fini This section holds executable instructions that contribute to the process termination code. That is, when a program exits normally, the system arranges to execute the code in this section. .init This section holds executable instructions that contribute to the process initialization code. That is, when a program starts to run the system arranges to execute the code in this section before the main program entry point (called main in C programs). .got每一个外部定义的符号在全局偏移表(Global Offset Table GOT)中有相应的条目。动态连接器将重新修改那些编译时还没有确定下来符号的地址。.plt简单的讲,plt保存的需要动态链接的函数的地址,在编译时,保存的是一个没用的值,在实际运行时,运行时会修改plt项,使之指向真正的函数地址。这里的函数值操作系统提供的库函数。PLT是一个这样的结构,它的entries包含了一些代码片段用来传输控制到外部的过程, 当传输控制到一个外部的函数时,它传输执行到PLT 中跟该symbol相关的那个entry(是在编译时候连接器安装的)。在PLT entry中第一条指令将jump到一个存储在GOT中的一个指针地址;假如符号还没有被解析,该GOT中存放着的是该PLT entry中的下一条指令地址。该指令push一个在重定位表中的偏移量到stack,然后下一条指令传输控制到PLT0入口。该PLT0包含了调用RTLD解析符号的函数代码。该解析符号函数地址由程序装载器已经插入到GOT2中了。动态连接器将展开stack并且获取需要解析符号在重定位表地址信息。重定位入口、符号表和字符串表共同决定着PLT entry引用的那个符号和在进程内存中符号应该存放的地址。假如可能的话,该符号将被解析出来,它的地址将被存放在被该PLT entry使用的GOT entry中。下一次该符号被请求时,与之对应的GOT已经包含了该符号的地址了。所以,所有后来的调用将直接通过GOT传输控制。动态连接器只解析第一次被二进制文件所引用的符号; Gcc静态编译时,反汇编代码如下所示:4 Disassembly of section .init: 5 6 000080b4 : 7 80b4: e52de004 str lr, sp, #-4! 8 80b8: eb000012 bl 8108 9 80bc: eb000033 bl 8190 10 80c0: eb014735 bl 59d9c 11 80c4: e49df004 ldr pc, sp, #4 12 Disassembly of section .text: 13 14 000080d0 : 15 80d0: e59fc024 ldr ip, pc, #36 ; 80fc 16 80d4: e3a0b000 mov fp, #0 ; 0x0 17 80d8: e49d1004 ldr r1, sp, #4 18 80dc: e1a0200d mov r2, sp 19 80e0: e52d2004 str r2, sp, #-4! 20 80e4: e52d0004 str r0, sp, #-4! 21 80e8: e59f0010 ldr r0, pc, #16 ; 8100 22 80ec: e59f3010 ldr r3, pc, #16 ; 8104 23 80f0: e52dc004 str ip, sp, #-4! 24 80f4: eb00003c bl 81ec 25 80f8: eb000157 bl 865c 26 80fc: 000085dc ldreqd r8, r0, -ip 27 8100: 000081c0 andeq r8, r0, r0, asr #3 28 8104: 00008550 andeq r8, r0, r0, asr r5 29 30 00008108 : 31 8108: e92d4400 stmdb sp!, sl, lr 32 810c: e59fa018 ldr sl, pc, #24 ; 812c 33 8110: e08fa00a add sl, pc, sl 34 8114: e59f3014 ldr r3, pc, #20 ; 8130 35 8118: e79a3003 ldr r3, sl, r3 36 811c: e3530000 cmp r3, #0 ; 0x0 37 8120: 11a0e00f movne lr, pc 38 8124: 11a0f003 movne pc, r3 39 8128: e8bd8400 ldmia sp!, sl, pc 40 812c: 0006eaa0 andeq lr, r6, r0, lsr #21.86 000081c0 : 87 81c0: e1a0c00d mov ip, sp 88 81c4: e92dd800 stmdb sp!, fp, ip, lr, pc 89 81c8: e24cb004 sub fp, ip, #4 ; 0x4 90 81cc: e59f2014 ldr r2, pc, #20 ; 81e8 91 81d0: e3a03014 mov r3, #20 ; 0x14 92 81d4: e5823000 str r3, r2 93 81d8: e59f2008 ldr r2, pc, #8 ; 81e8 94 81dc: e3a0301e mov r3, #30 ; 0x1e 95 81e0: e1c230b4 strh r3, r2, #4 96 81e4: e89da800 ldmia sp, fp, sp, pc 97 81e8: 00077690 muleq r7, r0, r6 98 99 000081ec : 100 81ec: e92d4ff0 stmdb sp!, r4, r5, r6, r7, r8, r9, sl, fp, lr 101 81f0: e24ddf72 sub sp, sp, #456 ; 0x1c8 102 81f4: e1a09000 mov r9, r0 103 81f8: e1a07001 mov r7, r1 104 81fc: e1a08002 mov r8, r2 105 8200: e1a0a003 mov sl, r3 106 8204: e59db1f0 ldr fp, sp, #496 107 8208: e0820101 add r0, r2, r1, lsl #2 108 820c: e2800004 add r0, r0, #4 ; 0x4 109 8210: e3a02000 mov r2, #0 ; 0x0 110 8214: e59f31ec ldr r3, pc, #492 ; 8408 111 8218: e1530002 cmp r3, r2 112 821c: 0a000002 beq 822c 113 8220: e5933000 ldr r3, r3 114 8224: e1530002 cmp r3, r2 115 8228: 03a02001 moveq r2, #1 ; 0x1 116 822c: e59f31d8 ldr r3, pc, #472 ; 840c 117 8230: e5832000 str r2, r3 118 8234: e59f31d4 ldr r3, pc, #468 ; 8410 119 8238: e5830000 str r0, r3 120 823c: e59d21f4 ldr r2, sp, #500 121 8240: e59f31cc ldr r3, pc, #460 ; 8414 122 8244: e5832000 str r2, r3 123 8248: e4903004 ldr r3, r0, #4 124 824c: e3530000 cmp r3, #0 ; 0x0 125 8250: 1afffffc bne 8248 126 8254: eb002251 bl 10ba0 127 8258: e59f31ac ldr r3, pc, #428 ; 840c 128 825c: e5934000 ldr r4, r3 129 8260: e3540000 cmp r4, #0 ; 0x0 130 8264: 1a000043 bne 8378 131 8268: e28d5f62 add r5, sp, #392 ; 0x188 132 826c: e1a0000d mov r0, sp 133 8270: eb001e02 bl fa80 134 8274: e3500000 cmp r0, #0 ; 0x0 135 8278: 028d5084 addeq r5, sp, #132 ; 0x84 136 827c: 02455002 subeq r5, r5, #2 ; 0x2 137 8280: 0a000013 beq 82d4 138 8284: e59f018c ldr r0, pc, #396 ; 8418 139 8288: e1a01004 mov r1, r4 140 828c: eb001e1f bl fb10 141 8290: e1a06000 mov r6, r0 142 8294: e3700001 cmn r0, #1 ; 0x1 143 8298: 0a000004 beq 82b0 144 829c: e1a01005 mov r1, r5 145 82a0: e3a02040 mov r2, #64 ; 0x40 146 82a4: eb001e4d bl fbe0 147 82a8: e2504000 subs r4, r0, #0 ; 0x0 148 82ac: ca000001 bgt 82b8 149 82b0: e59f0164 ldr r0, pc, #356 ; 841c 150 82b4: eb00026e bl 8c74 151 82b8: e1a00006 mov r0, r6 152 82bc: eb001e2f bl fb80 153 82c0: e354003f cmp r4, #63 ; 0x3f 154 82
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 兰州玉米购销合同范本
- 劳务派遣进厂合同范本
- 共享医疗资源的协议书
- 合伙修建房屋合同范本
- 占地迁坟赔偿合同范本
- 合伙人合同收益协议书
- 厂区无偿租赁合同范本
- 合同增减项目补充协议
- 代建车库租赁合同范本
- 2026年一级注册建筑师之建筑经济、施工与设计业务管理考试题库300道有完整答案
- 局麻药过敏反应课件
- 邮件流量分析-洞察及研究
- 《流体机械》课件第5章叶片式气体机械
- 基于微信小程序自助洗车系统的设计与实现
- 医院骨科主任竞聘课件
- 心源性脑栓塞治疗指南
- 南湖红船景区讲解
- 2025年少先队辅导员知识竞赛题库及答案
- 2023年游泳竞赛规则
- 供货进度保证措施方案
- 2025至2030可穿戴生命体征监护仪行业市场占有率及投资前景评估规划报告
评论
0/150
提交评论