链接器如何使用静态库解析引用

解析引用过程

  在符号解析阶段,链接器从左到右按照它们在编译器驱动程序命令行上的出现顺序来扫描可重定位目标文件和存到文件。

在这次扫描中,链接器维护一个可重定位目标文件的集合E(这个集合中的文件就是确定的最后合并成可执行文件的模块文件),

一个未解析的符合(即引用了但尚未定义的符号)集合U,以及一个已解析(前面已经定义但没有被引用)集合D

对于命令行上的每个文件 f ,链接器会判断 f 是一个目标文件还是存档文件。

1.判断输入文件类型

  如果是目标文件

    链接器将会把这个文件添加到集合E,并根据符号引用情况修改集合U和D的状态。然后处理下一个文件。

  如果是存档文件

    链接器将尝试匹配集合U中未解析的符号和存档文件成员定义的符号,如果存档文件的成员m定义了一个符号来解析U中的一个引用,

  那么久将m加入到集合E中,然后修改U和D的状态。对存档文件中的每个成员都重复这个过程,直到U和D不再发生变化,然后简单地丢弃

  不包含在集合E中的成员目标文件。然后链接器继续处理下一个文件。

2.判断集合U是否为空

  如果链接器扫描完命令行上的所以文件后,集合U仍不为空,则说明引用了未定义的符号,则链接器将会报错并终止程序。

  如果链接器扫描完命令行上的所以文件后,集合U仍为空,则将合并和重定位E中的目标文件,并输出可执行文件。

注意命令行上的库和目标文件的顺序

  一般将库放在命令行的结尾

  1.如果库之间是相互独立的,则可以以任意的顺序放在命令行的结尾处。

  2.如果库之间是相互依赖的关系,则必须对他们排序,使得对于每个被存档文件的成员外部引用的符号s,在命令行中至少有一个s的定义是在对s的引用之后的。

原文地址:https://www.cnblogs.com/blzm742624643/p/9756914.html

时间: 2024-07-29 07:30:25

链接器如何使用静态库解析引用的相关文章

gcc链接g++编译生成的静态库和动态库的makefile示例

使用c++开发程序或者库时,将库提供给其他人使用. 然而使用者是使用c开发的程序,链接g++编译生成的库时,于链接gcc生成的库,有所不同. 首先是静态库,以链接g++编译生成的libmylib.a为例子 mylib依赖于pthread,rt,math库,链接时必须放在mylib之后. 同时-Wl,--no-as-needed -ldl添加在末尾是必须的. arm和x86有些不同,就是arm的gcc不会自动链接数学库math,需要手动添加链接. 1 CC=arm-linux-gnueabihf-

链接(extern、static关键词\头文件\静态库\共享库)

原文链接:http://www.orlion.ga/781/ 一. 多目标文件的链接 假设有两个文件:stack.c: /* stack.c */ char stack[512]; int top = -1; void push(char c) {         stack[++top] = c; } char pop(void) {         return stack[top--]; } int is_empty(void) {         return top == -1; }

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

首先说说我为什么要去读这一章.这个学期开OS的课,在Morden Operating System上读到和Process有关的内容时看到这样一句话:“Process is fundamentally a container that holds all the information needed to run a program.”当时瞬间就想到了之前在csapp上看的模棱两可的“目标可执行文件”这个概念,于是重新又把它的第7章给读了一遍. 要理解linker的作用,首先要搞明白他在整个计算机

链接器简介

1.可执行程序产生流程 2.链接器 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程.这个文件可以被加载到存储器并执行. 链接可执行与编译时,也可执行与加载时,甚至执行与运行时. 链接器的主要工作就是: (1)符号解析.目标文件定义和引用的符号,将每个符号引用刚好和一个符号定义联系起来. (2)重定位.编译器和汇编器生成从地址0开始的代码和数据节.链接器将每个符号定义与一个存储器位置联系起来, 然后修改所有对这些符号的引用,使得它们指向这个存储器位置,从而重定位这些节. 链接器可分

[转]在VS2010 VC++项目中引用Lib静态库(以Openssl为例)

本文转自:http://kb.cnblogs.com/page/94467/ Openssl是个为网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法.常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用. 首先下载Openssl包:(http://www.openssl.org/),这是一个C语言类库包,在Windows下可以通过Perl对该类库包进行MakeBuild,产生libeay32.ssleay32的Lib以及Dll文件,具体操作详见:h

链接器

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

Linux下静态库与动态库

一.基本概念 1.1.什么是库        在 windows 平台和 linux 平台下都大量存在着库. 本质上来说库是一种可执行的二进制代码(但不可以独立执行),可以被操作系统载入内存执行. 由于 windows 和 linux 的平台不同(主要是编译器.汇编器和连接器 的不同),因此二者库的二进制是不兼容的. 本文仅限于介绍 linux 下的库. 1.2. 库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同点在于代码被载入的时刻不同: 静态库的代码在编译过程中已经被

linux下静态库和动态库一些东西

http://www.cnblogs.com/changefuture/archive/2011/12/22/2297460.html Linux  动态链接库和静态库示例 文件预览 文件目录树如下,如你所见,非常简单. libtest/ |-- lt.c |-- lt.h `-- test.c 代码 #lt.c /* lt.c * */ #include <stdio.h> void myprint(void) { printf("Linux library test!\n&quo

用VS2013+VELT-0.1.3进行Linux开发:静态库

快乐虾 http://blog.csdn.net/lights_joy/(QQ群:Visual EmbedLinux Tools 375515651) 欢迎转载,但请保留作者信息 本文仅适用于vs2013 + velt-0.1.3 1.1    什么是VELT VELT的全称是Visual EmbedLinuxTools,它是一个与visual gdb类似的visual studio插件,用以辅助完成Linux开发.利用这个插件,将可以在visual studio的IDE中进行Linux应用程序