C语言中连接器介绍
在C语言中。一个重要的思想就是分别编译。即若干个源程序能够在不同的时候单独进行编译。然后在恰当的时候整合到一起。可是连接器通常是与C编译器分离的,连接器怎样做到把若干个C源程序合并成一个总体呢?
典型的连接器把由编译器或汇编器生成的若干个目标模块。整合成一个被称为加载模块或可运行文件的实体,该实体可以被操作系统直接运行。当中。某些目标模块是直接作为输入提供给连接器的;而另外一些目标模块则是依据连接过程的须要。从包含有类似printf函数的库文件里取得的。
连接器通常把目标模块看成是由一组外部对象组成的。
每一个外部对象代表着机器内存中的某个部分。并通过一个外部名称来识别。
因此,程序中的每一个函数和每一个外部变量,假设没有被声明为static,就都是一个外部对象。
某些C编译器会对静态函数和静态变量的名称做一定改变,将它们也作为外部对象。
因为经过了“名称修饰”。所以它们不会与其它源程序文件里的同名函数或同名变量发生命名冲突。
大多数连接器都禁止同一个加载模块中的两个不同外部对象拥有同样的名称。然而。在多个目标模块整合成一个加载模块时,这些目标模块可能就包括了同名的外部对象。
连接器的一个重要工作就是处理这类命名冲突。
处理命名冲突的最简单办法就是干脆全然禁止。
对于外部对象是函数的情形,这样的做法是正确的。
一个程序假设包含两个同名的不同函数。编译器根本就不应该接受。而对于外部对象是变量的情形,问题就变得困难了。不同的连接器对这样的情形有着不同的处理方式。
如今讲讲连接器是怎样工作的?
连接器的输入是一组目标模块和库文件。连接器的输出是一个加载模块。
连接器读入目标模块和库文件。同一时候生成加载模块。
对每一个目标模块中的每一个外部对象,连接器都要检查加载模块,看是否已有同名的外部对象。假设没有,连接器就将该外部对象加入到加载模块中;假设有,连接器就要開始处理命名冲突。
除了外部对象之外,目标模块还可能包含了对其它模块中的外部对象的引用。比如:一个调用了函数printf的C程序所生成的目标模块。就包含了一个对函数printf的引用。
能够猜測得出。该引用指向的是一个位于某个库文件里的外部对象。在连接器生成加载模块的过程中。它必须同一时候记录这些外部对象的引用。当连接器读入一个目标模块时,它必须解析出这个目标模块中定义的全部外部对象的引用。并作出标记说明这些外部对象不再是没有定义的。
C语言中连接器介绍的更多相关文章
- c语言中函数的简单介绍
c语言中函数的介绍: 函数,简单的说就是代码的打包.存放在一个地方,当需要的时候调用. 函数分类: 1.无参无返回值函数 void func() 2.无参有返回值函数 int func() 3.有参 ...
- Java语言中的面向对象特性总结
Java语言中的面向对象特性 (总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知 ...
- 在C语言中利用PCRE实现正则表达式
1. PCRE简介 2. 正则表达式定义 3. PCRE正则表达式的定义 4. PCRE的函数简介 5. 使用PCRE在C语言中实现正则表达式的解析 6. PCRE函数在C语言中的使用小例子 1. P ...
- Standard C 语言标准函数库介绍
全面巩固所知所学,往精通方向迈进! Standard C 语言标准函数库速查 (Cheat Sheet) from:http://ganquan.info/standard-c/function/ C ...
- 在易语言中调用MS SQL SERVER数据库存储过程方法总结
Microsoft SQL SERVER 数据库存储过程,根据其输入输出数据,笼统的可以分为以下几种情况或其组合:无输入,有一个或多个输入参数,无输出,直接返回(return)一个值,通过output ...
- Coursera-Getting and Cleaning Data-week4-R语言中的正则表达式以及文本处理
博客总目录:http://www.cnblogs.com/weibaar/p/4507801.html Thursday, January 29, 2015 补上第四周笔记,以及本次课程总结. 第四周 ...
- C语言模块化编译介绍
C语言模块化编译介绍 模块化编程的概念 所谓模块化变成(多文件开发),就是多文件(.c文件)编程,一个.c文件和一个.h文件可以被称为一个模块. 头文件开发的注意事项: 1)头文件中可以和C程序一样引 ...
- Java C# C语言中的占位符
一般拼接一段字符串在编程中是很常见的事,下面简单做个总结: 什么是占位符?占位符就是先占住一个固定的位置,等着你再往里面添加内容的符号. 1.Java中处理方法: package com.amos; ...
- C语言中如何将二维数组作为函数的参数传递
今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不 ...
随机推荐
- 纸牌屋第一季/全集House of Cards迅雷下载
纸牌屋 第一季 House of Cards Season 1 (2013) 本季看点:经过数轮激烈角逐,新一届美国总统加勒特·沃克(迈克·吉尔 Michael Gill 饰)诞生,自称水管工的众议院 ...
- Lua的文件操作
先简单介绍一下被迫使用Lua的IO的情境: 游戏支持玩家自定义上传头像,在排行榜中会显示玩家列表(包括本服.跨服),原有的做法是先检测CCUserDefault中是否存在指定图片的key以及它的状态. ...
- 架构模式逻辑层模式之:表模块(Table Model)
表模块和领域模型比,有两个显著区别: 1:表模块中的类和数据库表基本一一对应,而领域模型则无此要求: 2:表模块中的类的对象处理表中的所有记录,而领域模型的一个对象代表表中的一行记录: 一般情况下,我 ...
- 升级pip后出现 ImportError: cannot import name main
原文链接 https://blog.csdn.net/accumulate_zhang/article/details/80269313 在Ubuntu中,升级了pip,再次使用pip 安装相关的 ...
- [转]IOS下如何判断机器是否越狱
转自: http://blog.csdn.net/kaizi318/article/details/9135385 关于判断iPhone是否是jailbreak机器,可参考如下代码: static c ...
- Chapter 1 -- UsingAndAvoidingNull
"Null sucks." -Doug Lea "Null 很恶心!" "I call it my billion-dollar mistake.&q ...
- FIR滤波原理及verilog设计
FIR(Finite Impulse Response)Filter:有限冲激响应滤波器,又称为非递归线性滤波器. FIR滤波器的冲击响应是一个值为滤波器抽头系数的采样序列,其脉冲响应由有限个采样值构 ...
- Key Vertex (hdu 3313 SPFA+DFS 求起点到终点路径上的割点)
Key Vertex Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Tota ...
- Kafka:ZK+Kafka+Spark Streaming集群环境搭建(六)针对spark2.2.1以yarn方式启动spark-shell抛出异常:ERROR cluster.YarnSchedulerBackend$YarnSchedulerEndpoint: Sending RequestExecutors(0,0,Map(),Set()) to AM was unsuccessful
Spark以yarn方式运行时抛出异常: [spark@master bin]$ cd /opt/spark--bin-hadoop2./bin [spark@master bin]$ ./spark ...
- 如何获取当前应用程序所用的OpenGL ES的版本
如何获取当前应用程序所用的OpenGL ES的版本? [答案] char* glVersion = (char*)glGetString(GL_VERSION); LOGW(&qu ...