什么是链接,为什么需要链接?
为什么需要链接
在实际开发中,我们一定是多文件编程,所有文件在编译后,需要合在一起,合在一起的过程就是链接的过程。
每一个源文件(就是.c文件,上图中的程序1)都有对应的零碎文件(就是.h文件),通过预编译(通过#include实现)把.c和.h文件整合成一个组合C文件,这个组合C文件的扩展名为.i。把组合C文件编译成汇编文件.s,目标文件为机器指令(放在一个.o文件当中),单个目标文件是不能工作的,因为各个目标文件是相互支撑工作的。
把各个目标文件整合的过程就叫链接过程。整合后的文件就叫可执行程序,windows后缀为.exe,Linux后缀为.out
链接过程都干了什么事
目标文件主要分为两个区域:数据区域和指令区域。 每一个指令和数据都被安排了地址。
(1)地址重定位: 目标文件被整合的时候,每个目标文件的数据区被整合到一起,每个目标文件的指令区被整合到一起。假如目标文件1被整合前指令的地址是00000001,目标文件n整合前指令的地址也是00000001,整合到一起后,他们的地址是要重新编排的,这个叫地址重定位。数据区域的地址相应的也要重新编排。
重定位地址的作用:CPU会通过这个重定位的地址进行寻址,找到在内存中要执行的指令和数据,然后取出指令执行,并按照指令要求处理数据。重定位以后,会给执行文件中的计算机指令数据,重新安排地址,CPU会通过这些地址取指令执行,并处理这些数据。最终需要通过这些地址找到内存中的指令和数据。
链接脚本:重定位时,这个重定位的地址是如何安排的呢,需要使用一个链接脚本文件,这个文件中会有重定位地址的说明,重定位时,会按照这个脚本的重定位地址的要求,来进行地址重定位工作。
(2) 符号统一 : 直接举个C语言中的例子,假设程序有两个.c文件,分别是a.c和b.c,这两个文件中都有名叫var的变量,a.c被编译得到a.o,b.c被编译得到b.o,将a.o和b.o链接到同一个文件时,var命名重复了,需要根据规则对着两个符号进行统一,与此相似的还有函数名的“符号统一”问题。
什么是链接,为什么需要链接?相关推荐
- 嵌入式学习笔记之二(静态链接与动态链接)
要了解静态链接与动态链接,首先要了解什么是静态链接和动态链接,这一部分这里不做讲解,可以去度娘查找. 1.静态链接 静态链接通过静态库进行链接,生成的目标程序中包含运行需要的所有库,可以直接运行,不过 ...
- 浅谈死链接和错误链接,如何防范死链接发生
最近我想我学了这么长时间的seo了,也该总结一下,每天一小总结,也作为自己的seo路程的一个总结.下面呢,我现在稍微介绍一下在seo概念性问题. 什么事死链接和错误链接,如何防范死链接发生? 死链接是 ...
- 爬虫 | 正则表达式提取腾讯教育新闻链接及图片链接
前面的爬虫都是通过标签来爬取的,今天就分享一个小例子使用正则表达式来提取网页信息.如果你对正则表达式不熟悉,可以查看我之前写的R正则表达式这篇文章.它对R几个常用正则表达式进行了详尽的解释,包括参数说 ...
- 编译有哪些阶段,动态链接和静态链接的区别 c++
预处理-->编译-->汇编-->链接 预处理:编译器将C程序的头文件编译进来,还有宏的替换 编译:这个阶段编译器主要做词法分析.语法分析.语义分析等,在检查无错误后后,把代码翻译成汇 ...
- Angular指令 - 何时以及如何使用编译,控制器,预链接和后链接[关闭]
本文翻译自:Angular directives - when and how to use compile, controller, pre-link and post-link [closed] ...
- 静态链接和动态链接优缺点
一.静态链接 静态链接 :不同的程序开发者和部门能够相对独立地开发和测试自己的程序模块,大大促进了程序开发效率. 优点: 代码装载速度快,执行速度略比动态链接库快: 只需保证在开发者的计算机中有正确的 ...
- linux gcc 静态编译,GCC 程序编译的静态链接和动态链接
(给Linux爱好者加星标,提升Linux技能)转自:Mr_Bluyee 在链接阶段中,所有对应于源文件的 .o 文件.'-l' 选项指定的库文件.无法识别的文件名(包括指定的.o目标文件和.a库文件 ...
- 静态库调用_静态链接和动态链接对比简析
0. 简介 在Linux环境下进行开发工作,代码要经过编译链接生成二进制可执行文件,才能被CPU识别并执行:程序的编译过程可以参考另外一篇文章<linux程序编译过程简析>:链接过程分为两 ...
- HTTP的长链接和短链接说明
HTTP的长链接和短链接实际上是TCP的长连接和短链接.首先我们先介绍一下TCP/IP协议组四层模型.其中包括以下: 应用层:HTTP.FTP.DNS.TELNET等协议 传输层:TCP.UDP 网络 ...
- mysql002多表查询.on链接分为三种情况,左链接,右链接,全链接
-- on链接(最实用),分为三种情况,左链接,右链接,全链接 -- 左外链接,左表全部显示,如果匹配不到右表的内容使用null代替. SELECT * FROM emp e LEFT JOIN de ...
最新文章
- 于XAML导入命名空间的代码
- 维基百科---似然函数
- 计算机与网络应用教材格式化,《计算机与网络应用》正式稿.docx
- python模仿百度云桌面_利用百度云接口实现车牌识别!人称Python调包侠!
- 设计模式——————观察者模式
- maven打包可执行jar
- CentOS 设置网络(修改IP修改网关修改DNS)
- BOJ 2773 第K个与m互质的数
- 高速PCB设计的一些注意事项
- 前往庄园失败 当前服务器不稳定,摩尔庄园手游登录不了是怎么回事 摩尔庄园手游登录失败怎么办...
- 音频算法工程师面试内容
- seo优化与html,HTML SEO 优化技巧
- HMAC和密钥导出(HMAC and Key Derivation)
- 题目58 工厂流水线调度(ok)
- 慧算账渠道发力增值服务初露锋芒
- 【VS2022引用其他项目的.cs文件】
- [luogu] P1637 三元上升子序列 树状数组
- pytest接口自动化测试框架搭建
- SDN环境搭建和基本功能验证
- springboot+vue框架搭建教程