文档介绍:该【程序的链接公开课获奖课件赛课一等奖课件 】是由【读书百遍】上传分享,文档一共【49】页,该文档可以免费在线阅读,需要了解更多关于【程序的链接公开课获奖课件赛课一等奖课件 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。本学期考核措施
本学期平时分占60%,期末考试占40%
小测试共2次,每次6分,共20分
作业加考勤基础分20分,少一次扣4分,作业不交加考勤不到场超过5次将取消考试资格。
试验课有两个试验,每次10分,共20
多种加分,回答问题,试验提前做完等。
期末考试形式为闭卷考试
第四章 程序的链接目的文献格式符号解析与重定位共享库与动态链接
可执行文献的链接生成
重要教学目的
使学生理解链接器是怎样工作的,从而可以养成良好的程序设计习惯,并增长程序调试能力。
通过理解可执行文献的存储器映像来深入深入理解进程的虚拟地址空间的概念。
包括如下内容
链接和静态链接概念
三种目的文献格式
符号及符号表、符号解析
使用静态库链接
重定位信息及重定位过程
可执行文献的存储器映像
可执行文献的加载
共享(动态)库链接
程序的链接
分如下三个部分简介
第一讲:目的文献格式
程序的链接概述、链接的意义与过程
ELF目的文献、重定位目的文献格式、可执行目的文献格式
第二讲:符号解析与重定位
符号和符号表、符号解析
与静态库的链接
重定位信息
第三讲:动态链接
动态链接的特性、程序加载时的动态链接、程序运行时的动态链接
一种经典程序的转换处理过程
1 #include <>
2
3 int main()
4 {
5 printf("hello, world\n");
6 }
经典的“ ”C-源程序
# i n c l u d e <sp> < s t d i o .
35 105 110 99 108 117 100 101 32 60 115 116 100 105 111 46
h > \n \n i n t <sp> m a i n ( ) \n {
104 62 10 10 105 110 116 32 109 97 105 110 40 41 10 123
\n <sp> <sp> <sp> <sp> p r i n t f ( " h e l
10 32 32 32 32 112 114 105 110 116 102 40 34 104 101 108
l o , <sp> w o r l d \ n " ) ; \n }
108 111 44 32 119 111 114 108 100 92 110 34 41 59 10 125
?
不能,需要转换为机器语言代码! 即:编译、汇编等
功能:输出“hello,world”
一种C语言程序举例
int buf[2] = {1, 2};
void swap();
int main()
{
swap();
return 0;
}
extern int buf[];
int *bufp0 = &buf[0];
static int *bufp1;
void swap()
{
int temp;
bufp1 = &buf[1];
temp = *bufp0;
*bufp0 = *bufp1;
*bufp1 = temp;
}
(1)预处理(cpp)。在高级语言源程序中插入所有用#include命令指定的文献和用#define申明指定的宏。(2)编译(cc1)。将预处理后的源程序文献编译生成对应的汇编语言程序。(3)汇编(as)。由汇编程序将汇编语言源程序文献转换为可重定位目的文献。(4)链接(ld)。由链接器将多种可重定位目的文献及库例程()链接起来,生成可执行文献。
可执行文献的生成
使用GCC编译器编译并链接生成可执行程序P:
unix> gcc -O2 -g -o p
unix> ./p
Linker (ld)
Translators
(cpp, cc1, as)
Translators
(cpp, cc1, as)
p
Source files
Separately compiled
relocatable object files
Fully linked executable object file
(contains code and data for all functions
defined in and )
GCC编译器的静态链接过程
引用符号的地址需要重定位
main()
int *bufp0=&buf[0]
swap()
System code
int buf[2]={1,2}
System data
可重定位目的文献
可执行目的文献
.text
.data
.text
.data
.text
.data
int buf[2]={1,2}
Headers
main()
swap()
0
int *bufp0=&buf[0]
More system code
System data
.text
.symtab
.debug
.data
int *bufp1
.bss
System code
static int *bufp1
.bss
虽然是swap的当地符号,
使用链接的长处
链接带来的好处1:模块化
(1)一种程序可以提成诸多源程序文献
(2)可构建公共函数库,如数学库,原则C库等
链接带来的好处2:效率高
(1)时间上,可分开编译
只需重新编译修改的源程序文献,然后重新链接
(2)空间上,无需包含共享库所有代码
源文献中无需包含共享库函数的源码,只要直接调用即可
可执行文献和运行时的内存中只需包含所调用函数的代码
而不需要包含整个共享库
链接操作的环节
Step 1. 符号解析(Symbol resolution)
程序中有定义和引用的符号 (包括变量和函数等)
void swap() {…} /* 定义符号swap */
swap(); /* 引用符号swap */
int *xp = &x; /* 定义符号 xp, 引用符号 x */
编译器将定义的符号寄存在一种符号表( symbol table)中.
符号表是一种构造数组
每个表项包含符号名、长度和位置等信息
链接器将每个符号的引用都与一种确定的符号定义建立关联
Step 2. 重定位
将多种代码段与数据段分别合并为一种单独的代码段和数据段
将本来符号表中的位置信息修改为重定位后的位置信息