码迷,mamicode.com
首页 > 其他好文 > 详细

《深入理解计算机系统》第七章读书笔记

时间:2016-04-04 19:38:12      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:

《深入理解计算机系统》第七章读书笔记


第七章:连接

一、连接

1.连接:将各种代码和数据部分收集起来并组合成为一个单一文件的过程。
  这个文件可被加载或拷贝到存储器并执行。
2.连接可以执行于编译时,也就是在源代码被翻译成机器代码
    也可以执行于加载时,也就是程序被加载器加载到存储器并执行时
         执行于运行时,有应用程序来执行。
3.连接是由链接器的程序自动执行的。
4.连接使分离编译成为可能。

  

PS:X86-64系统上用gcc -m32产生32位代码

7.1编译器驱动程序

1.大部分编译系统提供编译驱动程序:代表用户在需要时调用语言预处理器、编译器、汇编器和链接器。
   (1)C预处理器:源程序main.c->ASCII码中间文件main.i
   (2)C编译器:main.i->ASCII码汇编语言文件main.s
   (3)C汇编器:main.s->可重定位目标文件
2.运行链接器程序ld,将各种.o文件以及必要的系统目标文件组合起来,创建可执行文件。
3.运行可执行文件:./可执行文件名字
4.外壳调用操作系统中加载器函数,拷贝可执行文件中的代码和数据到存储器,将控制转移到这个程序的开头

  

7.2静态链接

ld静态链接器

1.以一组可重定位目标文件和命令行参数作为输入,生成一个完全链接的可以加载和运行的可执行目标文件作为输出。
2.输入的可重定位的目标文件由各种不同的代码和数据节组成
3.指令在一个节中,初始化的全局变量在另一个节中,而未初始化的变量又在另外一个节中。

为了构造可执行文件,链接器的任务:符号解析,重定位

  

7.3目标文件

   目标文件三种形式:可重定位目标文件,可执行目标文件,共享目标文件。
    目标文件格式:Linux——可执行可连接(ELF格式)
                Windows——可移植可执行格式(PE)

  

7.4可重定位目标文件

ELF可重定位目标文件包含下面几个节:
.test已编译程序的机器代码。
.rodata只读数据
.data已初始化的全局C变量
.bss未初始化的全局C变量。

.symtab:一个符号表,存放在程序中定义和引用的函数和全局变量的信息

  

7.5符号和符号表

每个可重定位目标模块m都有一个符号表,包含m所定义和引用的符号的信息。
在链接器的上下文中,三种不同的符号:
1.有m定义并能被其他模块引用的全局符号。全局链接器对应于非静态的C函数以及被定义为Cstatic 属性的全局变量。
2.有其他模块定义并被模块m以引用的全局符号——外部符号,对应于定义在其他模块中的C函数和变量
3.只被模块m定义和引用的本地符号。

  

 1.任何声明带有static属性的全局变量或者函数都是模块私有的。

 2.任河声明为不带static属性的全局变量和函数都是共有的,可以被其他模块访问

7.6符号解析

链接器解析符号引用方法:每个引用与它输入的可重定位目标文件的符号表中的一个确定的符号定义联系起来。
编译器只允许每个模块每个本地符号只有一个定义。
编译器还确保静态本地变量,它们也会有本地链接器符号,拥有唯一的名字。

  

7.6.1链接器如何解析多重定义的全局符号

在编译时:编译器向汇编器输出每个全局符号,或者是强或弱,而汇编器把这个信息隐含地编码在可重定位目标文件的符号表里。
强符号:函数和已初始化的全局变量。
弱符号:未初始化的全局变量。
Unix链接器关于多重定义符号的规则:
1.不允许有多个强符号
2.如果有一个强符号和多个弱符号,选强符号
3.如有多个弱符号,则从弱符号中任意选择一个。

  

7.6.2与静态库的连接

静态库:将所有相关的目标模块打包成为一个单独的文件

  

7.7重定位
重定位两步:
1.重定位节和符号定义
2.重定位节中的符号引用。

  

重定位条目

《深入理解计算机系统》第七章读书笔记

标签:

原文地址:http://www.cnblogs.com/zhengwei0712/p/5352535.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!