链接器在根据命令行中输入的可重定位目标文件和静态库的顺序从左到右的扫描这些文件。在这个扫描中,链接器会维护一个集合E,该集合包含了将来要被合并生产可执行文件的所有可重定位目标文件;维护了一个集合U,包含了未解决的符号(只引用了但还没有定义);还维护了一个集合D,包含被先前输入文件定义的符号。开始的时候这三个集合都为空。

  • 对于在命令行中的每个输入文件f,链接器都会去判断这个文件是目标文件还是静态库文件。如果是目标文件,链接器将f加入到集合E中,并将f中的已定义的符号和引用的符号分别加入到集合D和U中,并继续处理下一个文件。
  • 如果f是静态库文件,链接器会扫描静态库中的目标文件m,如果m中定义的符号包含在集合U中,那么就将m加入到E中,然后将m中定义的符号和引用的符号加入到集合D和U中。然后继续扫描静态库中的目标文件,直到U和D不再改变为止。
  • 如果链接器完成了命令行中所有输入文件的扫描,并且U为非空的,那么链接器会输出错误然后终止。如果U为空,则合并和重定位E中的目标文件来生成可执行文件。

  看上面的处理过程其实有一个问题,那就是如果库文件比引用库文件的目标文件先处理,那么最后会导致后面处理的目标文件引用的符号最终无法被解析。如果后面输入的库依赖于前面已经处理的库也会出现同样的问题,所以输入文件的顺序就变得很重要了,一般的规则是库文件放在命令行的最后,引用另一个目标文件f的文件m,m要比f先输入,如果m和f互相依赖,那么只有在f之后再输入一个m文件,库也是同样的处理。

转载于:https://www.cnblogs.com/chengxuyuancc/p/3479966.html

链接器怎样使用静态库来解决符号引用相关推荐

  1. VS远程开发(远程调试)编译报错:对‘xxx’未定义的引用(设置库依赖顺序)(已解决)pthread(项目-->属性-->链接器-->输入-->库依赖项)

    如图在VS中对linux进行远程开发时,编译报错: 貌似是因为在代码中使用了pthread.h的函数,链接库依赖顺序出了问题,我在ubuntu里手动使用gcc main.c -lpthread -o ...

  2. ios 重复引用 静态库_iOS 解决一个因三方静态库冲突产生的duplicate symbol的问题...

    转自:http://www.cnblogs.com/rayshen/p/5160218.html 最近在开发项目时编译三方.a时出现了冲突,原因是存在duplicate symbol. <1&g ...

  3. android开发静态库,Android:如何正确链接我自己的静态库?

    我有一个用C ++编写的Android项目,并且在链接阶段存在问题. 代码放在一些静态库中,这些库应该链接在一起. 我在网上发现了很多关于这个主题的问题和答案,其中大多数建议将我的库LOCAL_STA ...

  4. 【Linux命令】nm 查看动态库和静态库中的符号

    功能 列出.o .a .so中的符号信息,包括诸如符号的值,符号类型及符号名称等.所谓符号,通常指定义出的函数,全局变量等等. 使用 nm [option(s)] [file(s)] 有用的optio ...

  5. 静态链接之与静态库的链接

    1. 静态库 链接器读取一组可重定位目标文件,并把它们组合称为一个单一的可执行文件.可以通过将所有相关的可重定位目标文件打包成为一个单独的文件,这个文件就叫做静态库.在链接时,链接器只拷贝被程序引用的 ...

  6. Linux下的ELF文件、链接、加载与库(含大量图文解析及例程)

    Linux下的ELF文件.链接.加载与库 链接是将将各种代码和数据片段收集并组合为一个单一文件的过程,这个文件可以被加载到内存并执行.链接可以执行与编译时,也就是在源代码被翻译成机器代码时:也可以执行 ...

  7. 链接器、链接过程及相关概念解析

    文章目录 1. 编译器驱动程序 2. 目标文件 2.1 可重定位目标文件(.o) 2.2 可执行目标文件(无后缀) 2.3 共享目标文件(.dll和.so) 3. 链接器的任务 3.1 符号解析(sy ...

  8. 链接器(linker)的作用——CSAPP第7章读书笔记

    首先说说我为什么要去读这一章.这个学期开OS的课,在Morden Operating System上读到和Process有关的内容时看到这样一句话:"Process is fundament ...

  9. C++编译器与链接器工作原理

    原文地址 这里并没不是讨论大学课程中所学的<编译原理>,只是写一些我自己对C++编译器及链接器的工作原理的理解和看法吧,以我的水平,还达不到讲解编译原理(这个很复杂,大学时几乎没学明白). ...

最新文章

  1. kali linux 安装java_kali linux安装java
  2. MonkeyRunner 的使用一
  3. 支持全球探测点的新一代网站监控
  4. 【译】Build Knowledge Graph from unstructured corpus using Machine Learning
  5. 使用cloudera manager安装Oozie服务【详细步骤】
  6. [Link]NoSQL
  7. python中函数包括_python中函数都有哪些简单点的例子零基础
  8. Docker学习总结(19)——Google开源的容器集群管理系统Kubernetes介绍
  9. 如何使用 Java 调取 Python、R 的训练模型?
  10. 猴子都能懂的数据库范式详解
  11. 2 Features Engineering for Machine Learning中文翻译系列(二)
  12. [Wondgirl]从零开始学React Native之Text(五)
  13. do sb suggest to_suggest_suggest to do 和 suggest doing 的区别
  14. 谷歌统计Google Analytics使用入门
  15. 在postgre数据库中,强制删除一个数据库
  16. python招聘杭州拉勾网_Python拉勾网职位分析-Pyecharts
  17. 油菜花系统服务器能删除内容吗,油菜花期蜂群管理要点
  18. STM32通过SPI读W25Q64的ID时钟分析
  19. 单调、加班、血汗工厂,被夸大的富士康背后真相到底是什么?
  20. 全名k歌自定义图文链接(卡片)

热门文章

  1. Collections.sort()自定义排序方式
  2. 【Scratch】青少年蓝桥杯_每日一题_8.03_飞猫
  3. html中本页面路径怎么写,HTML之绝对路径与相对路径
  4. mysql 优惠卷表设计_这些年MySQL表设计踩过的坑!
  5. element ui表格点击整行选择_element-ui实现动态表头的表格问题汇总
  6. win定时关机_如何设置电脑定时关机?电脑新手有必要掌握一波!
  7. 博科b8网络版定位服务器位置,如何在企业服务器中采集奥维GPS定位设备的位置...
  8. 网传B站数据中心起火?所谓“现场图片”却是盗来的
  9. 暖通空调系统全面水力平衡解决方案
  10. 东北能源大数据中心正式成立,一期将建设2.4万平方米数据中心