《程序的链接》PPT课件.ppt
《《程序的链接》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《程序的链接》PPT课件.ppt(49页珍藏版)》请在三一办公上搜索。
1、本学期考核方法,本学期平时分占60%,期末考试占40%小测试共2次,每次6分,共20分作业加考勤基础分20分,少一次扣4分,作业不交加考勤不到场超过5次将取消考试资格。实验课有两个实验,每次10分,共20各种加分,回答问题,实验提前做完等。期末考试形式为闭卷考试,第四章 程序的链接目标文件格式符号解析与重定位共享库与动态链接,可执行文件的链接生成,主要教学目标使学生了解链接器是如何工作的,从而能够养成良好的程序设计习惯,并增加程序调试能力。通过了解可执行文件的存储器映像来进一步深入理解进程的虚拟地址空间的概念。包括以下内容链接和静态链接概念三种目标文件格式符号及符号表、符号解析使用静态库链接重
2、定位信息及重定位过程可执行文件的存储器映像可执行文件的加载共享(动态)库链接,程序的链接,分以下三个部分介绍第一讲:目标文件格式程序的链接概述、链接的意义与过程ELF目标文件、重定位目标文件格式、可执行目标文件格式第二讲:符号解析与重定位符号和符号表、符号解析与静态库的链接重定位信息第三讲:动态链接动态链接的特性、程序加载时的动态链接、程序运行时的动态链接,一个典型程序的转换处理过程,1#include 23 int main()4 5 printf(hello,worldn);6,经典的“hello.c”C-源程序,#i n c l u d e n n i n t m a i n()n 10
3、4 62 10 10 105 110 116 32 109 97 105 110 40 41 10 123n p r i n t f(h e l10 32 32 32 32 112 114 105 110 116 102 40 34 104 101 108l o,w o r l d n);n 108 111 44 32 119 111 114 108 100 92 110 34 41 59 10 125,hello.c的ASCII文本表示,计算机能够直接识别hello.c源程序吗?,不能,需要转换为机器语言代码!即:编译、汇编等,功能:输出“hello,world”,一个C语言程序举例,int
4、 buf2=1,2;void swap();int main()swap();return 0;,main.c,swap.c,extern int buf;int*bufp0=,(1)预处理(cpp)。在高级语言源程序中插入所有用#include命令指定的文件和用#define声明指定的宏。(2)编译(cc1)。将预处理后的源程序文件编译生成相应的汇编语言程序。(3)汇编(as)。由汇编程序将汇编语言源程序文件转换为可重定位目标文件。(4)链接(ld)。由链接器将多个可重定位目标文件及库例程(如printf.o)链接起来,生成可执行文件。,可执行文件的生成,使用GCC编译器编译并链接生成可执行
5、程序P:unix gcc-O2-g-o p main.c swap.cunix./p,GCC编译器的静态链接过程,引用符号的地址需要重定位,main(),main.o,int*bufp0=&buf0,swap(),swap.o,System code,int buf2=1,2,System data,可重定位目标文件,可执行目标文件,.text,.data,.text,.data,.text,.data,static int*bufp1,.bss,虽然是swap的本地符号,也需在.bss节重定位,使用链接的优点,链接带来的好处1:模块化(1)一个程序可以分成很多源程序文件(2)可构建公共函数库
6、,如数学库,标准C库等,链接带来的好处2:效率高(1)时间上,可分开编译只需重新编译修改的源程序文件,然后重新链接(2)空间上,无需包含共享库所有代码 源文件中无需包含共享库函数的源码,只要直接调用即可 可执行文件和运行时的内存中只需包含所调用函数的代码 而不需要包含整个共享库,链接操作的步骤,Step 1.符号解析(Symbol resolution)程序中有定义和引用的符号(包括变量和函数等)void swap()/*定义符号swap*/swap();/*引用符号swap*/int*xp=/*定义符号 xp,引用符号 x*/编译器将定义的符号存放在一个符号表(symbol table)中.
7、符号表是一个结构数组每个表项包含符号名、长度和位置等信息链接器将每个符号的引用都与一个确定的符号定义建立关联Step 2.重定位将多个代码段与数据段分别合并为一个单独的代码段和数据段将.o文件中每个符号的相对位置重定位为可执行文件中的绝对存储位置将原来符号表中的位置信息修改为重定位后的位置信息,三类目标文件,可重定位目标文件(.o file)其代码和数据可和其他可重定位文件合并为可执行文件每个.o 文件由对应的.c文件生成每个.o文件代码和数据地址都从0开始可执行目标文件(.a file)包含的代码和数据可以被直接复制到内存并被执行代码和数据地址为虚拟地址空间中的地址共享的目标文件(.so f
8、ile)特殊的可重定位目标文件,能在装入或运行时被装入到内存并自动被链接Windows 中称其为 Dynamic Link Libraries(DLLs),00000000:0:55 push%ebp 1:89 e5 mov%esp,%ebp 3:83 ec 10 sub$0 x10,%esp6:8b 45 0c mov 0 xc(%ebp),%eax 9:8b 55 08 mov 0 x8(%ebp),%edx c:8d 04 02 lea(%edx,%eax,1),%eax f:89 45 fc mov%eax,-0 x4(%ebp)12:8b 45 fc mov-0 x4(%ebp),%
9、eax 15:c9 leave 16:c3 ret,080483d4:80483d4:55 push%ebp 80483d5:89 e5 mov%esp,%ebp 80483d7:83 ec 10 sub$0 x10,%esp 80483da:8b 45 0c mov 0 xc(%ebp),%eax 80483dd:8b 55 08 mov 0 x8(%ebp),%edx 80483e0:8d 04 02 lea(%edx,%eax,1),%eax 80483e3:89 45 fc mov%eax,-0 x4(%ebp)80483e6:8b 45 fc mov-0 x4(%ebp),%eax
10、80483e9:c9 leave 80483ea:c3 ret,objdump-d test.o,objdump-d test,/*main.c*/int add(int,int);int main()return add(20,13);,/*test.c*/int add(int i,int j)int x=i+j;return x;,Executable and Linkable Format(ELF),两种视图 链接视图:Relocatable object files执行视图:Executable object files,节(section)是 ELF 文件中具有相同特征的最小可处理
11、单位.text节:代码.data节:数据.rodata:只读数据.bss:未初始化数据,由不同的段(segment)组成,描述节如何映射到存储段中,可多个节映射到同一段,如:可合并.data节和.bss节,并映射到一个可读可写数据段中,可重定位目标文件格式,ELF 头占16字节,包括字长、字节序(大端/小端)、文件类型(.o,exec,.so)、机器类型(如 IA-32)、节头表的偏移、节头表的表项大小及表项个数.text 节编译后的代码部分.rodata 节只读数据,如 printf 格式串、switch 跳转表等.data 节已初始化的全局变量.bss 节未初始化全局变量,仅是占位符,不占
12、据任何实际磁盘空间。目标文件格式区分初始化和非初始化是为了空间效率,可重定位目标文件格式,.symtab 节存放函数和全局变量(符号表)信息,它不包括局部变量条目.rel.text 节.text节的重定位信息,用于重新修改代码段的指令中的地址信息.rel.data 节.data节的重定位信息,用于对被模块使用或定义的全局变量进行重定位的信息.debug 节调试用符号表(gcc-g)strtab 节包含symtab和debug节中符号及节名Section header table(节头表)每个节的节名、偏移和大小,可执行目标文件格式,与.o文件稍有不同:ELF头中字段e_entry给出执行程序时
13、第一条指令的地址,而在可重定位文件中,此字段为0多一个.init节,用于定义_init函数,该函数用来进行可执行目标文件开始执行时的初始化工作少两.rel节(无需重定位)多一个程序头表,也称段头表(segment header table),是一个结构数组,可执行文件的存储器映像,0,%esp(栈顶),brk,0 xC00000000,0 x08048000,从可执行文件装入,程序(段)头表描述如何映射,可执行文件中的程序头表,typedef struct Elf32_Word p_type;Elf32_Off p_offset;Elf32_Addr p_vaddr;Elf32_Addr p_
14、paddr;Elf32_Word p_filesz;Elf32_Word p_memsz;Elf32_Word p_flags;Elf32_Word p_align;Elf32_Phdr;,程序头表能够描述可执行文件中的节与虚拟空间中的存储段之间的映射关系一个表项说明虚拟地址空间中一个连续的片段或一个特殊的节 以下是GNU READELF显示的某可执行目标文件的程序头表信息,可执行文件中的程序头表,程序头表中有8个表项,其中有两个是可装入段(type=LOAD)对应表项。第一可装入段对应第0 x000000 x004d3字节(包括ELF头、程序头表、.init、.text和.rodata节),
15、映射到虚拟地址0 x8048000开始长度为0 x4d4字节的区域,按0 x1000=212=4K字节对齐,具有只读/执行权限(Flg=RE),是只读代码段(read-only code)。第二可装入段对应第0 x000f0c开始长度为0 x108字节的.data节,映射到虚拟地址0 x8049f0c开始的长度为0 x110字节的存储区域,在0 x110=272字节的存储区中,前0 x108=264字节用.data节内容初始化,而后面272-264=8个字节对应.bss节,初始化为0,该段按0 x1000=4KB对齐,具有可读可写权限(Flg=RW),因此,它是一个可读写数据段(read/wr
16、ite data segment)。,程序的链接,分以下三个部分介绍第一讲:目标文件格式程序的链接概述、链接的意义与过程ELF目标文件、重定位目标文件格式、可执行目标文件格式第二讲:符号解析与重定位符号和符号表、符号解析与静态库的链接重定位信息第三讲:动态链接动态链接的特性、程序加载时的动态链接、程序运行时的动态链接,符号和符号解析,每个可重定位目标模块m都有一个符号表,它包含了在m中定义和引用的所有符号。有三种链接器符号:Global symbols(模块内部定义的全局符号)由模块m定义并能被其他模块引用的符号。例如,非static C函数和非static的C全局变量(指不带static的全
17、局变量)如,main.c 中的全局变量名bufExternal symbols(外部定义的全局符号)由其他模块定义并被模块m引用的全局符号 如,main.c 中的函数名swapLocal symbols(本模块的局部符号)仅由模块m定义和引用的本地符号。例如,在模块m中定义的带static的C函数和全局变量如,swap.c 中的static变量名bufp1 链接器局部符号不是指程序中的局部变量(分配在栈中的临时性变量),链接器不关心这种局部变量,符号和符号解析,int buf2=1,2;void swap();int main()swap();return 0;,main.c,extern i
18、nt buf;int*bufp0=,swap.c,Global,External,External,Local,Global,局部变量,目标文件中的符号表,符号表(symtab)中每个条目的结构如下,typedef struct int name;/*指向符号对应字符串在strtab节中的偏移*/int value;/*在对应section中的偏移量,可执行文件中是虚拟地址*/int size;/*符号对应目标所占字节数*/char type:4,/*符号对应目标的类型:数据、函数、源文件、节*/binding:4;/*符号对应目标是全局符号还是局部符号*/char reserved;char
19、 section;/*符号对应目标所在的section,或其他情况*/Elf_Symbol;,其他情况:ABS表示不该被重定位;UND表示未定义;COM表示未初始化数据(.bss),此时,value表示对齐要求,size给出最小大小,目标文件中的符号表,main.o中的符号表中最后三个条目,Num:valueSizeTypeBindOtNdxName8:08DataGlobal 03buf9:033FuncGlobal01main10:00NotypeGlobal0UNDswap,swap.o中的符号表中最后4个条目,Num:valueSizeType Bind OtNdxName8:04 D
20、ata Global 03bufp09:00 Notype Global 0UND buf10:036 Func Global 01swap11:44 Data Local 0COMbufp1,buf是main.o中第3节(.data)偏移为0的符号,是全局变量,占8B;main是第1节(.text)偏移为0的符号,是全局函数,占33B;swap是main.o中未定义的符号,不知道类型和大小,全局的(在其他模块定义),bufp1是未分配地址且未初始化的本地变量(ndx=COM),按4B对齐且占4B,符号解析,目的:将每个模块中引用的符号与某个目标模块中的定义符号建立关联。每个定义符号在代码段或
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序的链接 程序 链接 PPT 课件

链接地址:https://www.31ppt.com/p-5564363.html