- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第四章 程序的链接目标文件格式符号解析与重定位共享库与动态链接
可执行文件的链接生成
主要教学目标
使学生了解链接器是如何工作的,从而能够养成良好的程序设计习惯,并增加程序调试能力。
通过了解可执行文件的存储器映像来进一步深入理解进程的虚拟地址空间的概念。
包括以下内容
链接和静态链接概念
三种目标文件格式
符号及符号表、符号解析
使用静态库链接
重定位信息及重定位过程
可执行文件的存储器映像
可执行文件的加载
共享(动态)库链接
程序的链接
分以下三个部分介绍
第一讲:目标文件格式
程序的链接概述、链接的意义与过程
ELF目标文件、重定位目标文件格式、可执行目标文件格式
第二讲:符号解析与重定位
符号和符号表、符号解析
与静态库的链接
重定位信息、重定位过程
可执行文件的加载
第三讲:动态链接
动态链接的特性、程序加载时的动态链接、程序运行时的动态链接、动态链接举例
一个典型程序的转换处理过程
#include stdio.h
int main()
{
printf(hello, world\n);
}
经典的“ hello.c ”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.c的ASCII文本表示
功能:输出“hello,world”
预处理
(cpp)
编译
(cc1)
汇编
(as)
链接
(ld)
计算机不能直接执行hello.c!
原始的链接概念早在高级编程语言出现之前就已存在
最早程序员用机器语言编写程序,并记录在纸带或卡片上
链接器的由来
穿孔表示0,未穿孔为1
0:0101 0110
1:0010 0101
2: ……
3: ……
4: ……
5:0110 0111
6: ……
假设:0010-jmp
若在第5条指令前加入指令,则程序员需重新计算jmp指令的目标地址(重定位),然后重新打孔。
太原始了,无法忍受,咋办?
用符号表示而不用0/1表示!
用符号表示跳转位置和变量位置,是否简化了问题?
汇编语言出现
用助记符表示操作码
用符号表示位置
用助记符表示寄存器
…..
更高级编程语言出现
程序越来越复杂,需多人开发不同的程序模块
子程序(函数)起始地址和变量起始地址是符号定义(definition)
调用子程序(函数或过程)和使用变量即是符号的引用(reference)
一个模块定义的符号可以被另一个模块引用
最终须链接(即合并),合并时须在符号引用处填入定义处的地址
如上例,先确定L0的地址,再在jmp指令中填入L0的地址
链接器的由来
0:0101 0110
1:0010 0101
2: ……
3: ……
4: ……
5:0110 0111
6: ……
add B
jmp L0
……
……
……
L0:sub C
……
使用链接的好处
链接带来的好处1:模块化
(1)一个程序可以分成很多源程序文件
(2)可构建公共函数库,如数学库,标准C库等
链接带来的好处2:效率高
(1)时间上,可分开编译
只需重新编译被修改的源程序文件,然后重新链接
(2)空间上,无需包含共享库所有代码
源文件中无需包含共享库函数的源码,只要直接调用即可
可执行文件和运行时的内存中只需包含所调用函数的代码
而不需要包含整个共享库
一个C语言程序举例
int buf[2] = {1, 2};
void swap();
int main()
{
swap();
return 0;
}
main.c
swap.c
extern int buf[];
int *bufp0 = buf[0];
static int *bufp1;
void swap()
{
int temp;
bufp1 = buf[1];
temp = *bufp0;
*bufp0 = *bufp1;
文档评论(0)