深入理解计算机系统第四版_技术干货 |深入理解计算机系统之链接
上周刚看了这本书,趁热打铁更新一篇关于链接的干货。
这一部分内容是本书的第七章,讲解了程序的链接过程,主要分为静态链接和动态链接,以及链接过程中使用到的技术。
应试 ★★★:需要知道链接的基本概念,尤其是动态链接可能会考到。
修炼 ★★★★★:有的时候,你很可能会被一个意想不到的链接错误折磨好几天,往往这些错误编译系统不会警告,并在程序执行很久以后,才能在远离错误引发处表现出来。
01 程序编译过程
预处理阶段:处理以#开头的预处理命令;
编译阶段:翻译成汇编文件;
汇编阶段:将汇编文件翻译成可重定位目标文件;
链接阶段:将可重定位目标文件即main.o和 printf.o 等单独预编译好的目标文件进行合并,得到最终的可执行目标文件。
02 静态链接
静态链接器以一组可重定位目标文件为输入,生成一个完全链接的可执行目标文件作为输出。链接器主要完成以下两个任务:
符号解析:每个符号对应于一个函数、一个全局变量或一个静态变量(static),符号解析的目的是将每个符号引用与一个符号定义关联起来。
重定位:链接器通过把每个符号定义与一个内存位置关联起来,然后修改所有对这些符号的引用,使得它们指向这个内存位置。
多重定义全局变量
多重定义全局变量会造成一些意想不到的错误,而且是默默发生,编译系统不会警告,并会执行很久后才能在错误引发处很远表现出来。
尽量使用本地变量(static);全局变量赋初值(使其变成强符号,如果两次以上使用强符号,在链接的时候可以报错)
03 目标文件
可执行目标文件:可以直接在内存中执行;
可重定位目标文件:可与其它可重定位目标文件在链接阶段合并,创建一个可执行目标文件;
共享目标文件:这是一种特殊的可重定位目标文件,可以在运行时被动态加载进内存并链接;
04 动态链接
静态库有以下两个问题:
当静态库更新时那么整个程序都要重新进行链接;
对于 printf 这种标准函数库,如果每个程序都要有代码,这会极大浪费资源。
共享库是为了解决静态库的这两个问题而设计的,在 Linux 系统中通常用.so后缀来表示,Windows 系统上它们被称为DLL。它具有以下特点:
在给定的文件系统中一个库只有一个文件,所有引用该库的可执行目标文件都共享这个文件,它不像静态库一样会被复制和嵌入到引用它的可执行文件中;
在内存中,一个共享库的 .text 节(已编译程序的机器代码)的一个副本可以被不同的正在运行的进程共享。
---------- 悄悄话 -----------
后面我会逐步分享三个板块的内容:学习方法、技术干货和小鱼故事。技术干货主要是关于某个知识点的总结,类似于这篇这样的内容。
我也还在努力学习中,如果想和我交流具体学习方法、互相监督或是其他建议,可以直接添加个人微信Netlessfish,期待与你的交流。
今天,你转发锦鲤了吗?
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
深入理解计算机系统第四版_技术干货 |深入理解计算机系统之链接相关推荐
- 深入理解计算机系统第四版_《深入理解计算机系统》读书笔记 —— 第一章 计算机系统漫游...
本书第一章沿着一个程序的生命周期,简要地介绍一些逐步出现的关键概念.专业术语和组成部分. 一.信息就是位+上下文 在计算机系统中所有的信息都由一串比特来表示. 一串相同的比特(或者几个相同的字节)可以 ...
- 深入理解计算机系统第四版_深入理解计算机系统之存储器层次结构
我的计算机模型是这样的: CPU执行指令,内存犹如一个巨大的字节数组,存储着指令和数据,硬盘保存着各种程序与程序用到的数据.I/O完成输入输出的功能.在本文中我们抛开I/O,谈一谈关于CPU,内存,硬 ...
- 深入理解计算机系统 -资料整理 高清中文版_在所不辞的博客-CSDN博客_深入理解计算机系统第四版pdf
深入理解计算机系统 -资料整理 高清中文版_在所不辞的博客-CSDN博客_深入理解计算机系统第四版pdf
- JVM篇:《深入理解Java虚拟机第二版.SUN技术》——笔记
深入理解Java虚拟机第二版.SUN技术 第1章 Java体系结构介绍 1.1 Java体系结构包括四个独立但相关的技术 1.2 虚拟机 第2章 平台无关 2.1为什么要平台无关 2.2Java体系结 ...
- python编程第四版_清华编程教授强力推荐《Python编程》,指导你如何学习python
Python编程真的那么容易吗?仅仅是看理论就可以学以致用吗? 今天我给你介绍的这本书,也许会让你开始改变这种想法,因为这本书上的练习和案例以及指导本身就足够学好Python了. 清华编程教授强力推荐 ...
- MySQL mdl导入_技术分享 | 深入理解 MySQL MDL Lock
作者:高鹏(网名八怪) 文章末尾有他著作的<深入理解 MySQL 主从原理 32 讲>,深入透彻理解 MySQL 主从,GTID 相关技术知识. 本文来源:转载自公众号-mysql cod ...
- python 自动化运维 读取交换机数据_技术干货|数据中心自动化运维技术探索之交换机零配置上线...
近几年来,互联网行业处于一个快速发展的快车道,一个又一个风口不断地涌向周边行业.共享单车的出现解决了人们出行***一公里的问题:新零售概念的提出,无人货柜的出现,更是将线上和线下的数据打通,优化了人们 ...
- 深入java虚拟机 第四版_深入理解Java虚拟机-常用vm参数分析
Java虚拟机深入理解系列全部文章更新中... https://blog.ouyangsihai.cn/shen-ru-li-jie-java-xu-ni-ji-java-nei-cun-qu-yu- ...
- 数据结构与算法分析c++第四版_数据结构与算法 - 时空复杂度分析
这周主要总结了时间复杂度的学习,跟小伙伴们分享下,欢迎指正. 一.为何需要分析算法复杂度 挺多同学本科都学习过数据结构和算法这门课,但是有没有想过这门课到底是解决什么问题?科学家设计这些数据结构和算法 ...
- 数据结构与算法分析c++第四版_研分享 | 人工智能学院数据结构与算法分析考研备考整理...
数据结构与算法分析 1.在顺序表中插入或删除一个元素,需要平均移动(表中一半)元素,具体移动的元素个数与(表长和该元素在表中的位置)有关. 2.如果有两个数,每个数的所有约数(除它本身以外)的和正好等 ...
最新文章
- 创建模板_UG中如何创建属于自己的编程模板界面?
- hadoop配置文件详解系列(二)-hdfs-site.xml篇
- 最优化课堂笔记06-无约束多维非线性规划方法(含重点)
- 一道笔试题引发的Promise笔记
- 近期 AI 领域招聘、招生信息汇总
- list redis 怎样做排行_list类型的应用场景 —— Redis实战经验
- 3.1 Hadoop架构
- HashMap底层实现原理概述
- 索尼Xperia XZ1 Compact刷机,解锁BL,刷Twrp Recovery和Root教程
- 股票交易接口api的协议
- 用C#写一个微信登录软件(自己写协议)
- Flutter 打包问题 Could not resolve io.flutter:arm64_v8a_release
- 技术总结--android篇(四)--工具类总结
- css布局之版权信息
- 删除浏览器浏览器删除cookie方法
- 穿山甲成长中心——人能尽其才则百事兴
- Flowable—基本概念和重要名词解释
- 多线程与同步代码块详解
- Windows server2019所有国家语言转换,不在担心系统中英版本
- python怎么画高程三维网格图_matplotlib绘制等高线图
热门文章
- 基于CXF的WebService的安全验证问题
- iBooks 一样的翻书效果
- Lady Gaga Feat. Colby O'Donis - Just Dance
- Qt编译时报堆空间不足
- 【Linux】vim简介及安装
- linux注册节点报错,Linux 运维4月17日 5.102-5.103
- linux 查看各个用户下线程使用情况
- 计算机辅助英语教学电子版,计算机辅助英语教学探究.pdf
- ideal 如何创建jsp页面_HQChart使用教程1- 如何快速创建一个K线图页面
- linux 低功耗模式,stm32的低功耗模式: