版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十五讲第十五讲 - - 嵌入式程序编译及嵌入式程序编译及运行过程分析运行过程分析朱光明朱光明西安电子科技大学软件学院西安电子科技大学软件学院编译过程分析编译过程分析目标文件分析目标文件分析运行过程分析运行过程分析2022-4-232西安电子科技大学软件学院3西安电子科技大学软件学院4编译预处理编译预处理q在预处理阶段,输入的是C语言的源文件,主要处理源文件中的#ifdef、#include和#define等命令,生成中间文件*.i。q命令示例:gcc -E test.c o test.i编译编译q在编译阶段,输入的是中间文件*.i,编译后生成汇编语言文件*.s。q命令示例:gcc -S te
2、st.i o test.s西安电子科技大学软件学院5汇编汇编q在汇编阶段,将输入的汇编文件*.s转换成机器语言*.o。q命令示例:gcc -c test.s o test.o链接链接q在链接阶段,将*.o文件及其它库文件汇集成一个可执行的二进制文件。q命令示例:gcc test.o -o test西安电子科技大学软件学院6西安电子科技大学软件学院7C/C+C/C+源文件源文件cc1/g+cc1/g+头文件头文件汇编文件汇编文件asas目标文件目标文件生成库生成库连接命令文件连接命令文件可重定位模块可重定位模块ldldarar用户库用户库库列表库列表可执行程序可执行程序编译编译q编译时,gcc首
3、先调用预处理程序(cpp)对输入的源程序进行处理,然后调用cc1 将预处理后的程序编译成汇编代码汇编汇编qas将汇编语言程序转换为ELF (Executable and Linking Format,执行时链接文件格式)格式的可重定位目标代码,这些目标代码同其它目标模块或函数库易于定位和链接。qas产生一个交叉参考表和一个标准的符号表,产生的代码和数据能够放在多个区 (Section)中。西安电子科技大学软件学院8库管理库管理qar将多个可重定位的目标模块归档为一个函数库文件。q采用函数库文件,应用程序能够从该文件中自动装载要参考的函数模块,同时将应用程序中频繁调用的函数放入函数库文件中,易于
4、应用程序的开发管理。链接链接qld根据链接定位文件Linkcmds中的代码区、数据区、BSS区和栈区等定位信息,将可重定位的目标模块链接成一个单一的、绝对定位的目标程序。西安电子科技大学软件学院9西安电子科技大学软件学院10目标文件中的内容至少有编译后的目标文件中的内容至少有编译后的机器指令代码机器指令代码、数据、数据。还包括了链接时所须要的一些信息,比。还包括了链接时所须要的一些信息,比如如符号表、调试信息、字符串符号表、调试信息、字符串等。等。符号修饰标准、变量内层布局、函数调用方式等符号修饰标准、变量内层布局、函数调用方式等这些跟可执行代码二进制兼容性相关的内容称为这些跟可执行代码二进制
5、兼容性相关的内容称为ABIABI(Application Binary InterfaceApplication Binary Interface)。常见的)。常见的ABIABI格式:格式:西安电子科技大学软件学院11PEELF 一般目标文件将这些信息按不同的属性,以“节”(Section)的形式存储,有时候也叫“段”(Segment)。A.outA.outq不容易支持动态链接q不支持C+语言COFFCOFFq非扩展版本不支持C+和动态链接ELFELFq支持C+q支持动态链接q允许交叉编译和交叉链接西安电子科技大学软件学院12可重定位可重定位q编译器和汇编器创建q运行前需要被链接器处理可执行可
6、执行q完成了所有重定位工作和符号解析q除了运行时解析的共享库符号共享库共享库q链接器需要的符号信息q运行时可以直接执行的代码西安电子科技大学软件学院13西安电子科技大学软件学院14一个典型的一个典型的ELFELF可重定位文件可重定位文件qELF文件头部q一系列的节q节头部表q段头部(可选的)第一部分:第一部分:1616个字节的个字节的e_idente_ident,描述了生成该,描述了生成该文件的系统的字的大小文件的系统的字的大小和字节顺序,独立于和字节顺序,独立于ELFELF文件中的其它信息文件中的其它信息。q幻数:4个字节,0 x7f、E、L、Fqclass:1个字节,1=32位,2=64位
7、qdata:1个字节,1=小端,2=大端qversion:1个字节,1=当前版本qpad:剩余字节第二部分:帮助链接器第二部分:帮助链接器语法分析、解释目标文语法分析、解释目标文件的信息件的信息qe_type:1=重定位、2=可执行、3=共享库qe_machine:0=No machine、1=AT&T WE 32100、2=sparc、3=Intel 80386qe_version:0=Invalid version、1=Current versionqe_ehsize:ELF头部的大小 (以字节为单位)qe_flags:体系结构相关标志,总是0可执行文件相关的表项可执行文件相关的表
8、项qe_entry:程序的入口地址,如无入口地址则该项为0qe_phoff:程序头部表偏移量,若无则为0qe_phentsize:程序头部表中单个entry的大小qe_phnum:程序头部表中的entry个数重定位文件相关的表项重定位文件相关的表项qe_shoff:节头部表偏移量,若无则为0qe_shentsize:节头部表中单个entry的大小qe_shnum:节头部表中的entry个数qe_shstrndx:节名字串表所在的节index.text.text:已编译程序的机器代码:已编译程序的机器代码,具有,具有ALLOCALLOC和和EXECINSTREXECINSTR属属性的性的PROG
9、BITSPROGBITS类型区段,相类型区段,相当于当于a.outa.out的文本段的文本段qPROGBITS类型:程序内容,包括代码,数据和调试器信息qALLOC属性:程序加载时该区 段需要占用内存空间qEXECINSTR属性:该区段包含可执行的机器代码. .rodatarodata:只读数据,具有:只读数据,具有ALLOCALLOC属性和属性和PROGBITSPROGBITS类型类型区段。由于是只读数据,因此区段。由于是只读数据,因此没有没有WRITEWRITE属性。属性。.data.data:具有:具有ALLOCALLOC和和WRITEWRITE属性的属性的PROGBITSPROGBIT
10、S类型区段。类型区段。对应于对应于a.outa.out的数据段的数据段. .bssbss:具有:具有ALLOCALLOC和和WRITEWRITE属属性的性的NOBITSNOBITS类型区段。类型区段。BSSBSS区区段在文件中没有分配空间,因段在文件中没有分配空间,因此是此是NOBITSNOBITS类型,但由于会类型,但由于会在运行时分配空间,所以具有在运行时分配空间,所以具有ALLOCALLOC属性。属性。. .symsym:符号表。存放程序中定:符号表。存放程序中定义和引用的义和引用的函数和全局变量函数和全局变量的的信息。信息。.rel.txt.rel.txt:一个:一个.text.tex
11、t节中位置的节中位置的列表,当链接器把这个目标文列表,当链接器把这个目标文件和其它文件结合时,需要修件和其它文件结合时,需要修改这些位置。改这些位置。. .rel.datarel.data:一个:一个.data.data节中位置节中位置的列表,当链接器把这个目标的列表,当链接器把这个目标文件和其它文件结合时,需要文件和其它文件结合时,需要修改这些位置。修改这些位置。.line.line:源码到目标代码行号映:源码到目标代码行号映射,只有是使用射,只有是使用-g-g选项调用进选项调用进行编译时才会得到这张表行编译时才会得到这张表.debug.debug:一个调试用的符号表:一个调试用的符号表,包
12、含了定义的局部变量和类,包含了定义的局部变量和类型、全局变量的定义和引用型、全局变量的定义和引用. .strtabstrtab:一个字符串表,其内:一个字符串表,其内容包括容包括. .symtabsymtab和和.debug.debug节中节中的符号表,以及节头部中的节的符号表,以及节头部中的节名字。名字。sh_namesh_name:节名在节字串表:节名在节字串表中的索引中的索引sh_typesh_type:节的属性:节的属性sh_flagssh_flags:节的标志:节的标志sh_addrsh_addr:若该节可加载,:若该节可加载,则为该节第一个字节的地址则为该节第一个字节的地址,否则为
13、,否则为0 0sh_offsetsh_offset:节起始点在文件:节起始点在文件中的起始位置中的起始位置sh_sizesh_size:节大小(字节为单:节大小(字节为单位)位) sh_linksh_link:相关信息对应的节:相关信息对应的节号,若没有则为号,若没有则为0 0sh_infosh_info:节的其它信息:节的其它信息sh_alignsh_align:节的对齐粒度:节的对齐粒度sh_entsizesh_entsize:若节为一个表:若节为一个表时表项的大小时表项的大小 注:段头部表不一定在ELF头部后,节头部也不一定在最后ELFELF段头部表项段头部表项r_offsetr_off
14、set的含义:的含义:q可重定位文件:从节开始到受重定位影响的区域首部的偏移量q可执行文件或共享库:受重定位影响的单元的虚拟地址r_infor_info的含义:的含义:q24位的symbol域:重定位项在符号表中的索引q8位的type域:指示如何进行重定位 当加载器运行时,创建了右图所示的存储器映像。 在可执行文件中段头表的指导下,将可执行文件中的相关内容拷贝到代码和数据段。西安电子科技大学软件学院38#include#includeint main(int argc, char * argv)int *p = (int *)malloc(sizeof(int);scanf(“%d”,p);p
15、rintf(“%d”,*p);free(p); return 0; 在main之前,main函数的两个参数(argc和argv)已被正确传了进来。堆和I/O的初始化已经完成。#include#includeusing namespace std; string v; / v的构造函数已经在main之前被调用了int foo() int n; scanf(%d,&n); return n;const int a = foo(); / a的初始化和foo函数调用也在main前进行int main() printf(%dn,a); return 0;操作系统在创建进程后,把控制权交到了程序的
16、入口操作系统在创建进程后,把控制权交到了程序的入口,这个入口往往是运行库中的某个,这个入口往往是运行库中的某个入口函数入口函数。入口函数对运行库和程序运行环境进行入口函数对运行库和程序运行环境进行初始化初始化,包括,包括堆、堆、I/OI/O、线程、全局变量构造,等等。、线程、全局变量构造,等等。入口函数在完成初始化之后,入口函数在完成初始化之后,调用调用mainmain函数函数,正式开,正式开始执行程序主体部分。始执行程序主体部分。mainmain函数执行完毕之后,返回到入口函数,入口函数函数执行完毕之后,返回到入口函数,入口函数进行进行清理工作清理工作,包括全局变量析构、堆销毁、关闭,包括全
17、局变量析构、堆销毁、关闭I/OI/O等,然后进行系统调用结束进程。等,然后进行系统调用结束进程。C C程序的入口点,是程序的入口点,是符号符号_start_start的地址的地址。在。在_start_start地址地址处的启动代码(处的启动代码(startup_codestartup_code)是在目标文件)是在目标文件crt1.ocrt1.o中中定义的,对所有的定义的,对所有的C C程序都一样。程序都一样。下图展示了启动代码的调用序列(但省略了将函数参下图展示了启动代码的调用序列(但省略了将函数参数压入栈的代码),数压入栈的代码),atexitatexit注册程序终止时应调用的注册程序终止时
18、应调用的程序,程序,exitexit函数调用函数调用atexitatexit注册的代码,而后从注册的代码,而后从_exit_exit返返回回osos。当目标文件和共享库一起编译时就能生成使当目标文件和共享库一起编译时就能生成使用共享库的可执行程序。用共享库的可执行程序。对于使用共享库的可执行程序,文件中会有对于使用共享库的可执行程序,文件中会有一一. .interpinterp节,该节包含了动态链接器的路径。节,该节包含了动态链接器的路径。加载器将控制传递给动态链接器而不是程序加载器将控制传递给动态链接器而不是程序,动态链接器完成共享库的重定位。最后,动态链接器完成共享库的重定位。最后,将控制传递给应用程序。将控制传递给应用程序。动态链接器执行以下步骤完成从程序到进程动态链接器执行以下步骤完成从程序到进程映象:映象:q1.分析可执行文件中的动态信息section,决定需要哪些共享库。q2.定位和映射(map)那些共享库,并且分析它们动态信息section决定是否需要附加的共享库。q3.为可执行程序和那些需要的共享库执行重定位。q4.调用共享库中提供的初始化函数并且安排共享库提供的清除(cleanu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度航空航天零部件喷漆加工与质量控制协议2篇
- 2025年度航空航天零部件委托制造协议3篇
- 2025年度二零二五年度城市供热能源供应保障合同3篇
- 2025年度工程合同管理课程内容优化合同3篇
- 榆林学院《奢侈品管理》2023-2024学年第一学期期末试卷
- 永城职业学院《证券投资分析实验实验教学》2023-2024学年第一学期期末试卷
- 永城职业学院《马克思主义基础理论专题研究》2023-2024学年第一学期期末试卷
- 应天职业技术学院《景观生态学原理及应用》2023-2024学年第一学期期末试卷
- 营口理工学院《教学技术与媒体》2023-2024学年第一学期期末试卷
- 银川能源学院《水利水能规划》2023-2024学年第一学期期末试卷
- 江西省景德镇市2023-2024学年高二上学期1月期末考试物理试题
- 期末试卷-2023-2024学年语文六年级上册统编版
- 2024年1月国开电大法律事务专科《法律咨询与调解》期末考试试题及答案
- 快速响应客户需求机制
- 北京市东城区2023-2024学年九年级上学期期末语文试题(含答案)
- 汽车安全与法规 (第3版) 课件 第4-6章 汽车被动安全性、汽车主动安全系统、汽车被动安全性能试验
- 刘铁敏《金融专业英语》(第2版)-习题参考答案20
- 交通事故的处理流程
- 小学学科竞赛颁奖词
- 《生产异常培训》课件
- 数学分析(一)试卷1
评论
0/150
提交评论