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语言中如何将二维数组作为函数的参数传递
今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不 ...
随机推荐
- SharePoint Online 切换经典视图
SharePoint online 默认是现代视图,我们可以通过Powershell命令切换默认视图. 以下,是完成的Powershell命令: # This file uses CSOM. Repl ...
- 2016 移动应用质量大数据报告--转自腾讯Bugly
2016年,在“互联网+”战略的推动下,移动互联网与越来越多传统行业的结合更加紧密,用户使用移动互联网的工作场景.生活场景.消费场景都在悄然发生着改变, 移动互联网产品在智能硬件.医疗.汽车.旅游.教 ...
- SVG Path路径使用(一)
一.<path> 标签 <path> 标签用来定义路径. 下面的命令可用于路径数据: M = moveto L = lineto H = horizontal lineto V ...
- django时区设置以及全球用户如何各自显示当地时间
在Django的配置文件settings.py中,有两个配置参数是跟时间与时区有关的,分别是TIME_ZONE和USE_TZ 如果USE_TZ设置为True时,Django会使用系统默认设置的时区,即 ...
- spring学习之@SessionAttributes
一.@ModelAttribute 在默认情况下,ModelMap 中的属性作用域是 request 级别是,也就是说,当本次请求结束后,ModelMap 中的属性将销毁.如果希望在多个请求中共享 M ...
- spring mvc 接受前台json @RequestBody json 属性 空 使用 JsonProperty spring mvc 获取json转乘bean
请给json序列序列化成的javabean 属性加上 @JsonProperty(value = "real_name") 否则 springmvc 可能接受不到数据 ja ...
- 以双斜杠//开头的URL的含义
在HTML网页中,有时会发现类似于//www.studyofnet.com/news/1341.html这样的代码,那么,这种以双斜杠//开头的URL的含义是什么呢? 在WEB网页中,有时会发现类似下 ...
- 使用jstl标签时提示The absolute uri: http://java.sun.com/jsp/jstl/core cannot
http://www.360doc.com/content/11/1219/15/1007797_173395882.shtml 检查应用目录下WEB-INF的lib里是否有jstl.jar和stan ...
- 用SLF4j/Logback打印日志-2
本篇主要介绍logback的输出源配置,logback默认提供了很多输出源,但是用的最多的是这几种: OutputStreamAppender 日志输出到一个二进制流,可以通过 <encoder ...
- 京东的Netty实践,京麦TCP网关长连接容器架构
背景 早期京麦搭建 HTTP 和 TCP 长连接功能主要用于消息通知的推送,并未应用于 API 网关.随着逐步对 NIO 的深入学习和对 Netty 框架的了解,以及对系统通信稳定能力越来越高的要求, ...