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 Set-SPUser 命令拒绝访问
· 前言 最近碰到一个问题,由于User Profile Service服务有问题,用户信息无法更新.所以,想到Set-SPUser命令可以更新,于是乎找到这个命令,但是更新的时候发现拒绝访问的错误. ...
- ExtJS 4.2 教程-04:数据模型
转载自起飞网,原文地址:http://www.qeefee.com/extjs-course-4-data-model ExtJS 4.2 教程-01:Hello ExtJS ExtJS 4.2 教程 ...
- putty adb
putty.exe -adb -P 5037 transport-usb 网络调试也是可以的 先connect 再执行上面的命令 http://files.cnblogs.com/files/ahuo ...
- Chrome快捷键大全
Chrome上我基本不怎么用快捷键,但是发现了切换标签页的快捷键后觉得十分好用,所以就分享如下. 切换上一个标签:Ctrl+PgUp 切换下一个标签:Ctrl+PgDn 打开新标签页:Ctrl+T 通 ...
- 深入探索 JUnit 4
开始之前 关于本教程 引入 Java 5 注释为 JUnit 带来了显著改变,使它从一个受广大开发人员了解和喜爱的测试框架转变成了一个更为精简但却不那么为人熟知的框架.在本教程中,我将探讨 JUnit ...
- jdk环境变量配置 java环境变量配置
进行java开发,首先要安装jdk,安装了jdk后还要进行环境变量配置: 1.下载jdk(http://java.sun.com/javase/downloads/index.jsp),我下载的版本是 ...
- 0mq 入门 (转)
最近做后台发现很多地方需要队列,我用东西一般有两个要求: 1) 够傻够简单. 2) 有源码,能看又能改. 最后相中了0mq,下面介绍如何安装和写个简单的例子.一. linux平台: ...
- mysql启动报错cannot allocate memory for the buffer pool处理
今天启动mysql服务器时失败了.去/var/log/mysql/查看error.log,报错信息如下: 160123 22:29:26 InnoDB: Initializing buffer poo ...
- HTML5读取本地文件
本文转自:转:http://hushicai.com/2014/03/29/html5-du-qu-ben-di-wen-jian.html感谢大神分享. 常见的语言比如php.shell等,是如何读 ...
- Java-Shiro(一):简介
简介 Apache Shiro是Java的一个安全权限框架. Shiro可以非常容易的开发出足够好的额应用,其不仅可以用在JavaSE环境,也可以用在Java SE环境. Shiro可以完成:认证.授 ...