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


第七章:连接

连接

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.重定位节中的符号引用。

重定位条目

8.可执行目标文件

9.加载可执行目标文件

加载:将程序拷贝到存储器并运行的过程
在32位Linux系统中代码段从地址0x08048000处开始。

10.动态链接共享库

共享库是一个目标,在运行时,可以加载到任意的存储器地址,并和一个在存储器中的程序链接起来。这个过程称为动态链接,是由动态链接器的程序来执行的。
通常用.so后缀来表示,称为DLL(动态链接库)。  

1.在任何给定的文件系统中,对于一个库只有一个.so文件。所有引用该库的可执行目标文件共享这个.so文件中的代码和数据。
2.一种共享方式就是隐式链接,基本的思路:当创建可执行文件时,静态执行一些链接,然后在程序加载时,动态完成链接过程。
3.一种共享方式就是“显式链接”,应用程序被加载时,动态链接器加载和链接共享库的情景。应用程序还可能在它运行时要求动态链接器加载和链接任意共享库,而无需在编译时链接那些库到应用中。

11.从应用程序中加载和连接共享库

12.处理目标文件的工具

AR:创建静态库,插入、删除、列出和提取成员。
STRINGS:列出一个目标文件中所有可打印的字符串。
STRIP:从目标文件中删除符号的信息。

  

转载于:https://www.cnblogs.com/zhengwei0712/p/5352535.html

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

  1. 《重构》第七章--读书笔记

    第七章 在对象之间搬移特性 --读书笔记 在对象的设计过程中,要决定把对象放在哪里,可能不会一开始就做对,但是可以运用重构,改变自己原先的设计,这就用到了本章所提到额重构手法. 7.1 Move Me ...

  2. 《程序员自我修养》第七章读书笔记

    书还是接上回,本篇主要对第七章的相关内容进行总结.第七章主要对动态链接的相关内容进行分析. 7.1 为什么要动态链接 既然要对动态链接进行分析,首先应对动态链接出现的原因进行一个简单的分析.动态链接从 ...

  3. 《文明之光》第七章读书笔记

    第七章--一个家族的奇迹--文艺复兴 综述:美第奇家族曾是这个世界上最富有,最具影响力的家族,他们控制着欧洲的金融,与皇室联姻,左右着教皇的任命.虽然这个家族随着它的最后一位成员的去世而终结,可我们现 ...

  4. 深入理解计算机系统-第七章(链接)笔记

    深入理解计算机系统-第七章(链接)笔记 背景 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程 这个文件可被加载(拷贝)到存储器中并执行: 链接可以执行于编译时,也就是源代码翻译成机器码 ...

  5. 《构建之法》第4.17章读书笔记

    <构建之法>第4.17章读书笔记 第四章 原文语句: 异常不能跨过DLL或进程的边界来传递信息,所以异常不是万能的. 提出问题: 1.什么是DLL?DLL是来解决什么问题的? 网上说法: ...

  6. Python编程:从入门到实践第六章读书笔记6.3遍历字典

    Python编程:从入门到实践第六章读书笔记6.3遍历字典 #coding:gbk#6.3.1遍历所有的键-值对 user_0 = {'username': 'efermi','first': 'en ...

  7. 《人人都是产品经理》第四章读书笔记及读后感作文2400字

    <人人都是产品经理>第四章读书笔记及读后感作文2400字: 最近一直在忙别的学习,以至于好久没有更新公众号了,也好久没有写读书笔记了.<人人都是产品经理>这本书其实早在一个月前 ...

  8. 放松就上当了?——《思考,快与慢》第5章读书笔记

    <思考,快与慢>第5章读书笔记 是放松引起的错觉? 首先给大家一个判断,下图左右两家羊绒大衣店,忽略价格,你更喜欢哪一家?(2秒回答) 大部分人应该会选择左边的店铺,相较来说也更容易对左边 ...

  9. Android深度探索--HAL与驱动开发----第五章读书笔记

    第五章主要学习了搭建S3C6410开发板的测试环境.首先要了解到S3C6410是一款低功耗.高性价比的RISC处理器它是基于ARMI1内核,广泛应用于移动电话和通用处理等领域. 开发板从技术上说与我们 ...

最新文章

  1. python包安装_Python及图像处理相关包安装
  2. dwr 写的小程序,配置
  3. Redis radix tree源码解析
  4. 怎么查jupyter lab 内核_抗氧化精华推荐 CHA:LAB诗蕾泊帮你告别“零点肌”|抗氧化|精华-综合资讯...
  5. 网页中弹出自定义对话框,并进行传值
  6. vue.js 源代码学习笔记 ----- decoder
  7. python 推荐系统库_python-recsys:一款实现推荐系统的python库
  8. cmd中,执行java命令与javac命令的区别
  9. ODBC、OLE DB、 ADO的区别
  10. 十道解分式方程及答案_100道八年级解分式方程练习题(带答案)
  11. 1167. Anagrammatic Distanc (字符串匹配)
  12. 如何屏蔽移动垃圾短信10658464
  13. dns提供商主机名_什么是FQDN?它和主机名有区别吗?
  14. Java创建对象方式初谈
  15. 忽视警告_不要忽视下雨的风险2
  16. HTML代码实现符号及商标
  17. 记录一次Visual Studio运行webservice调用中控打卡机出现的问题
  18. java 数据容器 有序_java容器-全览
  19. 7⽂件查找和压缩问题和练习
  20. 【后端教程】低代码起势,为什么它有希望“干掉”开发? | 甲子光年

热门文章

  1. Python之面向对象进阶系列
  2. mysql的结构,段页区,及客户端命令
  3. 使用 Rx 中预定义的 Subject
  4. java 字符串排序
  5. UVA 10405 - Longest Common Subsequence
  6. 坚持完成这套学习手册,你就可以去 Google 面试了
  7. deeplearning URL
  8. Android-support-v4 v7 v8 v13 v17 的区别和特性说明
  9. 在Linux安装配置Tomcat 并部署web应用 ( 三种方式 )
  10. percona-Toolkit