链接器简介

1、可执行程序产生流程

2、链接器

链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程。这个文件可以被加载到存储器并执行。

链接可执行与编译时,也可执行与加载时,甚至执行与运行时。

链接器的主要工作就是:

(1)符号解析。目标文件定义和引用的符号,将每个符号引用刚好和一个符号定义联系起来。

(2)重定位。编译器和汇编器生成从地址0开始的代码和数据节。链接器将每个符号定义与一个存储器位置联系起来,

然后修改所有对这些符号的引用,使得它们指向这个存储器位置,从而重定位这些节。

链接器可分两类:

(1)静态链接

由静态链接器完成,以一组可重定位目标文件(通常静态库)和命令行参数作为输入,生成一个完全链接的可以加载和运行

的可执行目标文件作为输出。静态库,编译器提供的一种机制,将相关的目标模块打包成为一个单独的文件,

这个文件就是静态库,用作链接器的输入,链接器只拷贝静态库里被应用程序引用的目标模块。

其他的处理方式,例如:

A,编译器辨认对标准函数的调用,直接生成相应的代码。显著增加编译器的复杂度,添加、删除或修改标准函数时,

都需要一个新编译器版本。

B,所有标准C函数都放在一个单独的可重定位目标模块中,把这个模块链接到可以执行文件中。

主要缺点是完全拷贝标准函数集合,对任何标准函数的修改,都需要重新编译整个源文件。

注意:各个库的成员相互独立,可以按照任何顺序放置在命令行结尾处。

   如果不相互独立,那么必须排序。

(2)动态链接

静态库解决了如何让大量相关函数对应用程序可用的问题,然后静态库需要定期维护和更新。另外在运行时,

应用程序需要复制库中的代码到运行进程中,浪费存储系统资源。

共享库是解决静态库缺陷的一个创新产物。

共享库也称共享目标,在Unix系统中,通常用.so后缀,在Windows系统中,称为DLL。

共享库是一个目标模块,在运行时,可以加载到任意的存储器地址并和一个在存储器中的程序链接起来。

这个过程就是动态链接,由动态链接器完成。

所有引用该库的可执行目标文件共享这个.so文件中的代码和数据,而不是像静态库那也拷贝和嵌入到引用它们的可执行文件中。

参考书目:编译原理(龙书)

      深入理解计算机系统(强烈推荐)

时间: 2024-07-29 08:21:08

链接器简介的相关文章

【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)

作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42239705  参考博客 : [嵌入式开发]嵌入式 开发环境 (远程登录 | 文件共享 | NFS TFTP 服务器 | 串口连接 | Win8.1 + RedHat Enterprise 6.3 + Vmware11) 开发环境 : -- 操作系统 : Vmware11 + RedHat6.3 企业版 + Win8.1; -- 硬件 : OK-6410-A 开发

自己动手写编译器、链接器内容简介

<自己动手写编译器.链接器> 本书讲述了一个真实编译器的开发过程,源语言是以C语言为蓝本,进行适当简化定义的一门新语言,称之为SC语言(简化的C语言),目标语言是大家熟悉的Intel x86机器语言.在本书中,读者将看到从SC语言定义,到SCC编译器开发的完整过程.本书介绍的SCC编译器,没有借助Lex与Yacc这些编译器自动生成工具,纯手工编写而成,更便于学习和理解.为了生成可以直接运行EXE文件,本书还实现了一个链接器.读完本书读者将知道一门全新的语言如何定义,一个真实的编译器.链接器如何

自己动手写编译器、链接器目录结构

自序 8第1章 引言 101.1 Hello World编译过程分析 101.1.1 Hello World程序源文件 101.1.2 词法分析 111.1.3 语法分析 121.1.4 语义分析 131.1.5 链接器 141.2 SCC编译器简介 161.2.1 SCC编译器架构 161.2.2 SCC编译器开发环境 171.2.3 SCC编译器运行环境 18第2章 文法知识 202.1 语言概述 202.2 形式语言 212.2.1 字母表和符号串 212.2.2 文法与语言的形式定义 2

媒体播放器之:TCPMP播放器简介

*************************************************************************************************************************** 作者:EasyWave                                                             时间:2014.09.06 类别:Media播放器-TCPMP播放器简介                  

007.链接器命令脚本LD文件教程(1)

开发人员如何指定一个二进制镜像文件的内部布局呢?可以传递给链接器一个链接描述文件,也成为链接器命令脚本.可以将这个特殊的文件看做一份构造二进制可执行镜像的"配方".下面代码中显示了U-Boot引导加载程序使用的链接器描述文件的部分内容. 该脚本从这里开始定义了二进制ELF镜像的输出段.它指示链接器将名为.resetvec的代码段放置在数据镜像的固定地址处,即地址0xFFFFFFFC.此外,它还指定这个段的剩余部分全部填充为1(0xffff).这是因为一个闪存的存储阵列在被擦除后内容全部

编写链接器脚本

一个链接器脚本里面有三个段:代码段,数据段,bss段. 除了段的信息,一个链接器脚本还应该包括: 1.规定起始链接地址. 2.指明对齐方式. 3.还可以设置变量. 4.规定哪个文件时代码首文件. 下面敲得是一段完整的链接器脚本的文件.代码首文件是指链接的时候把哪一个文件放在最前面. 使用方法为: 来自为知笔记(Wiz)

链接器

作者:左少华 时间:2015-05-24 转载请注明出处: http://blog.csdn.net/shaohuazuo/article/details/45957971 连接器的功能 链接器是将各种代码和数据部分收集起来并合成一个单一文件的过程, 这个文件可以被加载到存储器中执行. 链接器的执行时机 可以执行于编译时,也就是在源代码被翻译成机器代码的时候. 可以执行于加载时,也就是程序被加载器加载到存储器,并执行时. 可以执行于运行时,由应用程序来执行. 链接是通过链接器程序自动执行的. 为

易语言 无法定位链接器

解决方法:打开安装的目录 e/vc98linker/双击 link.e 00.运行 ,点击修改 易语言 无法定位链接器 解决方法 教程下载:点击下载

vs2008调试 Release(链接器来生成调试信息)

VS2008 Release 修改配置: 1.项目——>属性——>C/ C++ ——> 常规 ——>调试信息格式——>用于“编辑并继续”的程序数据库(/ZI) 2.项目——>属性——>C/ C++ ——> 优化——>优化——>禁用(/Od) 3.项目——>属性——>C/ C++ ——> 优化——>优化——>全程序优化(否) 4.项目——>属性——>链接器 ——>生成调试信息——>是(/DEBU