上周刚看了这本书,趁热打铁更新一篇关于链接的干货。

这一部分内容是本书的第七章,讲解了程序的链接过程,主要分为静态链接动态链接,以及链接过程中使用到的技术。

应试 ★★★:需要知道链接的基本概念,尤其是动态链接可能会考到。

修炼 ★★★★★:有的时候,你很可能会被一个意想不到的链接错误折磨好几天,往往这些错误编译系统不会警告,并在程序执行很久以后,才能在远离错误引发处表现出来。

01 程序编译过程

  • 预处理阶段:处理以#开头的预处理命令;

  • 编译阶段:翻译成汇编文件;

  • 汇编阶段:将汇编文件翻译成可重定位目标文件;

  • 链接阶段:将可重定位目标文件即main.o和 printf.o 等单独预编译好的目标文件进行合并,得到最终的可执行目标文件。

02 静态链接

静态链接器以一组可重定位目标文件为输入,生成一个完全链接的可执行目标文件作为输出。链接器主要完成以下两个任务:

  • 符号解析:每个符号对应于一个函数、一个全局变量或一个静态变量(static),符号解析的目的是将每个符号引用与一个符号定义关联起来。

  • 重定位:链接器通过把每个符号定义与一个内存位置关联起来,然后修改所有对这些符号的引用,使得它们指向这个内存位置。

多重定义全局变量

  • 多重定义全局变量会造成一些意想不到的错误,而且是默默发生,编译系统不会警告,并会执行很久后才能在错误引发处很远表现出来。

  • 尽量使用本地变量(static);全局变量赋初值(使其变成强符号,如果两次以上使用强符号,在链接的时候可以报错)

03 目标文件

  • 可执行目标文件:可以直接在内存中执行;

  • 可重定位目标文件:可与其它可重定位目标文件在链接阶段合并,创建一个可执行目标文件;

  • 共享目标文件:这是一种特殊的可重定位目标文件,可以在运行时被动态加载进内存并链接;

04 动态链接

静态库有以下两个问题:

  • 当静态库更新时那么整个程序都要重新进行链接;

  • 对于 printf 这种标准函数库,如果每个程序都要有代码,这会极大浪费资源。

共享库是为了解决静态库的这两个问题而设计的,在 Linux 系统中通常用.so后缀来表示,Windows 系统上它们被称为DLL。它具有以下特点:

  • 在给定的文件系统中一个库只有一个文件,所有引用该库的可执行目标文件都共享这个文件,它不像静态库一样会被复制和嵌入到引用它的可执行文件中;

  • 在内存中,一个共享库的 .text 节(已编译程序的机器代码)的一个副本可以被不同的正在运行的进程共享。

---------- 悄悄话 -----------

后面我会逐步分享三个板块的内容:学习方法、技术干货和小鱼故事。技术干货主要是关于某个知识点的总结,类似于这篇这样的内容。

我也还在努力学习中,如果想和我交流具体学习方法、互相监督或是其他建议,可以直接添加个人微信Netlessfish,期待与你的交流。


今天,你转发锦鲤了吗?

↓  ↓  ↓  ↓  ↓  ↓  ↓  ↓  ↓


深入理解计算机系统第四版_技术干货 |深入理解计算机系统之链接相关推荐

  1. 深入理解计算机系统第四版_《深入理解计算机系统》读书笔记 —— 第一章 计算机系统漫游...

    本书第一章沿着一个程序的生命周期,简要地介绍一些逐步出现的关键概念.专业术语和组成部分. 一.信息就是位+上下文 在计算机系统中所有的信息都由一串比特来表示. 一串相同的比特(或者几个相同的字节)可以 ...

  2. 深入理解计算机系统第四版_深入理解计算机系统之存储器层次结构

    我的计算机模型是这样的: CPU执行指令,内存犹如一个巨大的字节数组,存储着指令和数据,硬盘保存着各种程序与程序用到的数据.I/O完成输入输出的功能.在本文中我们抛开I/O,谈一谈关于CPU,内存,硬 ...

  3. 深入理解计算机系统 -资料整理 高清中文版_在所不辞的博客-CSDN博客_深入理解计算机系统第四版pdf

    深入理解计算机系统 -资料整理 高清中文版_在所不辞的博客-CSDN博客_深入理解计算机系统第四版pdf

  4. JVM篇:《深入理解Java虚拟机第二版.SUN技术》——笔记

    深入理解Java虚拟机第二版.SUN技术 第1章 Java体系结构介绍 1.1 Java体系结构包括四个独立但相关的技术 1.2 虚拟机 第2章 平台无关 2.1为什么要平台无关 2.2Java体系结 ...

  5. python编程第四版_清华编程教授强力推荐《Python编程》,指导你如何学习python

    Python编程真的那么容易吗?仅仅是看理论就可以学以致用吗? 今天我给你介绍的这本书,也许会让你开始改变这种想法,因为这本书上的练习和案例以及指导本身就足够学好Python了. 清华编程教授强力推荐 ...

  6. MySQL mdl导入_技术分享 | 深入理解 MySQL MDL Lock

    作者:高鹏(网名八怪) 文章末尾有他著作的<深入理解 MySQL 主从原理 32 讲>,深入透彻理解 MySQL 主从,GTID 相关技术知识. 本文来源:转载自公众号-mysql cod ...

  7. python 自动化运维 读取交换机数据_技术干货|数据中心自动化运维技术探索之交换机零配置上线...

    近几年来,互联网行业处于一个快速发展的快车道,一个又一个风口不断地涌向周边行业.共享单车的出现解决了人们出行***一公里的问题:新零售概念的提出,无人货柜的出现,更是将线上和线下的数据打通,优化了人们 ...

  8. 深入java虚拟机 第四版_深入理解Java虚拟机-常用vm参数分析

    Java虚拟机深入理解系列全部文章更新中... https://blog.ouyangsihai.cn/shen-ru-li-jie-java-xu-ni-ji-java-nei-cun-qu-yu- ...

  9. 数据结构与算法分析c++第四版_数据结构与算法 - 时空复杂度分析

    这周主要总结了时间复杂度的学习,跟小伙伴们分享下,欢迎指正. 一.为何需要分析算法复杂度 挺多同学本科都学习过数据结构和算法这门课,但是有没有想过这门课到底是解决什么问题?科学家设计这些数据结构和算法 ...

  10. 数据结构与算法分析c++第四版_研分享 | 人工智能学院数据结构与算法分析考研备考整理...

    数据结构与算法分析 1.在顺序表中插入或删除一个元素,需要平均移动(表中一半)元素,具体移动的元素个数与(表长和该元素在表中的位置)有关. 2.如果有两个数,每个数的所有约数(除它本身以外)的和正好等 ...

最新文章

  1. 创建模板_UG中如何创建属于自己的编程模板界面?
  2. hadoop配置文件详解系列(二)-hdfs-site.xml篇
  3. 最优化课堂笔记06-无约束多维非线性规划方法(含重点)
  4. 一道笔试题引发的Promise笔记
  5. 近期 AI 领域招聘、招生信息汇总
  6. list redis 怎样做排行_list类型的应用场景 —— Redis实战经验
  7. 3.1 Hadoop架构
  8. HashMap底层实现原理概述
  9. 索尼Xperia XZ1 Compact刷机,解锁BL,刷Twrp Recovery和Root教程
  10. 股票交易接口api的协议
  11. 用C#写一个微信登录软件(自己写协议)
  12. Flutter 打包问题 Could not resolve io.flutter:arm64_v8a_release
  13. 技术总结--android篇(四)--工具类总结
  14. css布局之版权信息
  15. 删除浏览器浏览器删除cookie方法
  16. 穿山甲成长中心——人能尽其才则百事兴
  17. Flowable—基本概念和重要名词解释
  18. 多线程与同步代码块详解
  19. Windows server2019所有国家语言转换,不在担心系统中英版本
  20. python怎么画高程三维网格图_matplotlib绘制等高线图

热门文章

  1. 基于CXF的WebService的安全验证问题
  2. iBooks 一样的翻书效果
  3. Lady Gaga Feat. Colby O'Donis - Just Dance
  4. Qt编译时报堆空间不足
  5. 【Linux】vim简介及安装
  6. linux注册节点报错,Linux 运维4月17日 5.102-5.103
  7. linux 查看各个用户下线程使用情况
  8. 计算机辅助英语教学电子版,计算机辅助英语教学探究.pdf
  9. ideal 如何创建jsp页面_HQChart使用教程1- 如何快速创建一个K线图页面
  10. linux 低功耗模式,stm32的低功耗模式: