什么是链接?

链接其实就是连接的意思,将所有相关的东西连接起来。

简单理解静态连接和动态链接:

静态链接:编译时完成链接

动态链接:程序运行起来后,根据需求再去链接,这就是动态链接

静态链接

什么是静态链接

所谓静态链接,其实就是在编译时,调用ld/collect2链接程序,将所有的.o中的机器指令整合到一起,然后保存到可执行文件中。

什么时候用到静态链接呢?

编译时用到,编译时的链接就是静态链接,所以链接程序ld/collect2,也可以称为静态链接器。

静态链接时做了什么事?

两件事,符号解析 和 重定位。

符号解析

符号解析的作用

符号解析的目的就是将符号的引用(使用)和符号的定义联系起来。

举例

为了方便实现符号解析,编译得到.o文件时,每个.o文件都会包含符号一张的符号表。

符号表记录什么?

①记录本模块定义了些什么符号

②记录本模块引用了些什么符号

旁注:单个.c文件,也被称为一个模块,整个工程就是以模块为单位来进行组织的,模块化组织很重要,不进行模块化在组织的话,就只能将所有内容全写到一个文件中,对于大型c程序来说,显然很难操作。但是模块化组织有一个麻烦事就是,你需要将所有的模块合成一个完整的可执行程序,这个合成的麻烦事就是由collect2/ld来承担的。

重定位

怎么理解重定位这三个字?

简单理解就是,之前的地址不对,重新定位新地址,就好比导航时目的地址弄错了,重新定位一个新的目的地址,这就是“重定位”的含义。

重定位作用

将.o文件中每个机器指令的逻辑地址,重定位为(转为)实际运行的地址。

①如果是裸机运行的:运行的地址就是内存的物理地址。

②如果是基于OS运行的:运行地址就是虚拟内存的地址。不过虚拟内存机制,最终还是会将虚拟地址会转为物理地址。

.o中的逻辑地址

逻辑地址只是理论上的,这个地址是无法被cpu取指运行的,因为逻辑地址即不是实际的物理地址,也不是虚拟内存的虚拟地址,它只是在编译时临时给的一个编号。.o中的每个节(.text/.rodata/.data等),逻辑地址都是从0开始的。由于.o是纯二进制文件,很难被阅读,所以需要将它反汇编为ascii的汇编。反汇编时,每条二进制的机器指令,会被翻译为对应的每条汇编指令,是一一对应的关系。

旁注1:在64位系统下,地址是64位的,所以十六进制的0地址有16个0。

旁注2:我们这里只关心地址问题,有关.o文件的更多内容,我们这里不做介绍。

可执行程序中的运行地址

我们这里编译出的可执行文件,是运行在Linux的虚拟内存上的,所以重定位后的运行地址是“虚拟地址”。

在Linux下,链接器重定位后的虚拟地址是多少呢?

①32位Linux系统 在32位Linux里面,虚拟地址是32位的,也就是4个字节。在32位的Linux下,重定位后,虚拟地址从0x08048000开始。0x08048000:32位。每个节不再是从0开始的,节之间的虚拟地址是挨着的

②64位系Linux统 在64位Linux里面,虚拟地址是64位的,也就是8个字节。虚拟地址从0x0000000000400000开始。0x0000000000400000:64位。每个节不再是从0开始的,节之间的虚拟地址是挨着的

动态链接

什么是动态链接?

所谓动态链接,就是在编译的时候只留下调用接口,当程序真正运行的时候,才去链接执行,动态链接这件事不是在编译时发生的,是在程序动态运行时发生的,所以叫称为动态链接。

什么时候用到动态链接呢?

使用动态库时,动态库就是动态链接的。比如程序中调用printf函数,这个函数基本都是动态库提供的,程序编译后代码里面是没有printf函数代码的,只有printf这个接口,当程序运行起来后,再去动态链接printf所在的动态库,那么程序就能调用printf函数了。

如何理解这里说的接口?

站在ascii的c源码角度来说,这个接口就是printf函数名,但是程序被编译为二进制后,printf就变成了一个地址,所以站在二进制的角度来说,接口就是函数第一条指令的地址。

动态链接的实现者是谁

参考:剖析gcc -v输出

动态链接由动态链接器来实现的,回顾gcc -v显示的链接信息

动态链接器

-dynamic-linker /lib64/ld-linux-x86-64.so.2(链接(加载)动态库)

静态链接 VS 动态链接的更多相关文章

  1. Delphi之DLL知识学习2---静态链接和动态链接

    静态连接 静态链接是指Delphi 编译器把要调用的函数和过程编译成可执行代码.函数的代码可存留在应用程序的 .dpr文件或一单元中.当链接用户的应用程序时,这些函数与过程便成为最终的可执行文件的一部 ...

  2. MFC的静态链接、动态链接

    项目属性页面可以查看更改编译方式,推荐使用静态编译.也可以在创建MFC项目时选择静态编译. 标准Windows库,使用的是系统API,Win32是面向API的编程平台.Win32项目使用的是此编译方式 ...

  3. 在JavaWeb项目中处理静态文件或动态链接拼接网站地址的最优处理方案

    在开发网站时候我们会遇到下面问题? - 在引用网页中引用js和css或者动态的Servlet的时候我们是写绝对路径还是相对路径? - 如果写相对路径吧,上线偶尔会报404,还要手动去拼接绝对路径 - ...

  4. [CSAPP-II] 链接[符号解析和重定位] 静态链接 动态链接 动态链接接口

    1 平台 转http://blog.csdn.net/misskissc/article/details/43063419 1.1 硬件 Table 1. 硬件(lscpu) Architecture ...

  5. [转]静态库、动态库,dll文件、lib文件,隐式链接、显式链接

    转自:https://blog.csdn.net/dcrmg/article/details/53427181 静态链接.动态链接 静态库和动态库分别应用在静态链接方式和动态链接方式中,所谓静态链接方 ...

  6. 编译有哪些阶段,动态链接和静态链接的区别 c++

    预处理—->编译—->汇编—->链接 预处理:编译器将C程序的头文件编译进来,还有宏的替换 编译:这个阶段编译器主要做词法分析.语法分析.语义分析等,在检查无错误后后,把代码翻译成汇 ...

  7. 静态库、动态库,dll文件、lib文件,隐式链接、显式链接浅见

    静态链接.动态链接 静态库和动态库分别应用在静态链接方式和动态链接方式中,所谓静态链接方式是指在程序执行之前完成所有的链接工作,把静态库一起打包合入,生成一个可执行的目标文件(EXE文件).所谓动态链 ...

  8. Python 调度算法 死锁 静动态链接 分页分段

    1 select poll epoll的区别基本上select有3个缺点: 连接数受限查找配对速度慢数据由内核拷贝到用户态poll改善了第一个缺点 epoll改了三个缺点. (1)select,pol ...

  9. Python 调度算法 死锁 静动态链接(七)

    1 select poll epoll的区别 基本上select有3个缺点: 连接数受限 查找配对速度慢 数据由内核拷贝到用户态 poll改善了第一个缺点 epoll改了三个缺点. (1)select ...

随机推荐

  1. 《Learning a Discriminative Feature Network for Semantic Segmentation》解读

    旷世18年的CVPR,论文链接:https://arxiv.org/abs/1804.09337 Motivation:针对分割中的“类内不一致”和“类间一致性”的两大问题,设计了结合Smooth n ...

  2. css样式writing-mode垂直书写测试

    writing-mode:控制文字的属性方向,但是不是所有的浏览器都兼容,在网页上使用时,有的浏览器显示不出该样式.该文测试的是垂直书写:网上对于测试的属性值的解释是:tb-rl:上-下,右-左.对象 ...

  3. Amazon MWS Scratchpad

    https://mws.amazonservices.com/scratchpad/index.html Use this page to test Amazon MWS API request an ...

  4. 通过调用Windows本地RPC服务器bypass UAC

    备战一个月比赛,导致近期都没啥时间更新博客,正好今天看到一篇通过调用本地RPC服务的文章,觉得非常有意思,就拿来充充博客. 在1.0版本的APPINFO.DLL中的RPC服务调用接口ID为:201ef ...

  5. windows下大数据开发环境搭建(4)——Spark环境搭建

    一.所需环境 · Java 8 · Python 2.6+ · Scala · Hadoop 2.7+ 二.Spark下载与解压 http://spark.apache.org/downloads.h ...

  6. LeetCode 442. 数组中重复的数据(Find All Duplicates in an Array) 17

    442. 数组中重复的数据 442. Find All Duplicates in an Array 题目描述 Given an array of integers, 1 ≤ a[i] ≤ n (n ...

  7. C之指针加减运算

    法则:1.指针减指针,语法正确,结果得一个整型值,表示两数值之间的对象类型的空间距离,而不是对象之间的字节数差值 2.指针加指针,语法错误,     3.指针加整形值,语法正确,表示后移N个空间单位 ...

  8. 1183: 零起点学算法90——海选女主角(C语言)

    一.题目 http://acm.wust.edu.cn/problem.php?id=1183&soj=0 二.分析 从描述来看,就是找出一个二维数组中绝对值最大的数: 带符号的32位整数,刚 ...

  9. Ubuntu Server Swap 分区设置

    方案一:仅在内存耗尽的情况下才使用 swap 分区 # 首先进入 sudo 模式 sysctl vm.swappiness=0 # 临时生效 echo "vm.swappiness = 0& ...

  10. DG环境恢复同步遇到报错ORA-00353ORA-00334以及ORA-00600[2619], [47745]

    问题说明 客户环境主库4节点RAC11.2.0.4,单实例DG环境,DG由于空间不足,导致同步中断,由于DG备库未应用的归档主库都再,本次恢复的方式,是开启dg mrp进程,自动同步追上主库. 以下遇 ...