嘉兆新闻> 连接器是怎么读懂C源程序的

连接器是怎么读懂C源程序的

发 布:2019/1/28 9:02:24查 看:184


一个C程序可能是由多个分别编译的部分组成,这些不同部分通过一个通常叫做链接器(或连接器,载入器)的程序合并成一个整体。因为编译器一般每次只处理一个文件,所以它不能检测出那些需要一次了解多个源程序文件才能察觉的错误。而且,在许多系统中链接器是独立于C语言实现的,因此如果前述错误的原因与C语言相关,链接器对此也同样束手无策。某些C语言实现提供了一个称为lint的程序,可以捕获到大量的此类错误,但遗憾的是并非全部的C语言实现都提供了该程序。如果能够找到诸如lint的程序,就一定善加利用,这一点无论怎么强调都不为过。

C语言中的一个重要思想就是分别编译(Separate Compilation),即若干个源程序可以在不同的时候单独进行编译,然后在恰当的时候整合到一起。但是,链接器一般是与C编译器分离的,它不可能了解C语言的诸多细节。那么,链接器是如何做到把若干个C源程序合并成一个整体呢?尽管链接器并不理解C语言,然而它却能够理解机器语言和内存布局。编译器的责任就是把C源程序“翻译”成对链接器有意义的形式,这样链接器就能够“读懂”C源程序了。


连接器是怎么读懂C源程序的


典型的链接器把有编译器或汇编器生成的若干个目标模块,整合成一个被称为载入模块或可执行文件的实体,该实体能够被操作系统直接执行。其中,某些目标模块是直接作为输入提供给链接器的;而另外一些目标模块则是根据链接过程的需要,从包括有类似printf函数的库文件中取得的。链接器通常把目标模块看成是一组外部对象(external object)组成的。每个外部对象代表着机器内存中的某个部分,并通过一个外部名称来识别。因此,程序中的每个函数和每个外部变量,如果没有声明为staTIc,就都是一个外部对象。某些C编译器会对静态函数和静态变量的名称做一定改变,将他们也作为外部对象。由于经过了“名称修饰”,所以他们不会与其它原程序文件中的同名函数或同名变量发生命名冲突。


大多数链接器都禁止同一个载入模块中的两个不同外部对象拥有相同的名称。然而,在多个目标模块整合成一个载入模块时,这些目标模块可能就包含了同名的外部对象。链接器的一个重要工作就是处理这类命名冲突。处理命名冲突的最简单的方法就是干脆完全禁止。对于外部对象是函数的情形,这种做法当然正确,一个程序如果包括两个同名的不同函数,编译器根本就不应该接受。而对于外部对象是变量的情形,问题就变得有些困难了。不同的链接器对这种情形有着不同的处理方式。


链接器的输入是一组目标模块或者库文件。链接器的输出是一个载入模块。链接器读入目标模块和库文件,同时生成载入模块。对每个目标模块中的每个外部对象,链接器要检查载入模块,看是否已有同名的外部对象。如果没有,链接器就将该外部对象添加到载入模块中;如果有,链接器就要开始处理命名冲突。


除了外部对象之外,目标模块中还可能包括了对其他模块中的外部对象的引用。例如,一个调用了函数printf的C程序所生成的目标模块,就包括了一个对函数printf的引用。可以推测得出,该引用指向的是一个位于某个库文件中的外部对象。在链接器生成载入模块的过程中,它必须同时记录这些外部对象的引用。当链接器读入一个目标模块时,它必须解析出这个目标模块中定义的所有外部对象的引用,并作出标记说明这些外部对象不再是未定义的。

 


一个c程序可能是由多个分别编译的部分组成,这些不同部分通过连接器合并成一个整体。因为编译器一般每次只处理一个文件,所以吧能检测出那些需要一次了解多个源程序文件才能察觉的错误。某些c程序实现提供了一个称为lint的程序,可以捕获大量的此类错误,但不是所有的都能捕获到!


嘉兆公司拥有40年测试测量行业经验,专业的销售、技术、服务团队,在众多领域都非常出色,包括:通用微波/射频测试、无线通信测试、数据采集记录与分析、振动与噪声分析、电磁兼容测试、汽车安全测试、精密可编程测量电源、微波/射频元器件、传感器等。


并分别在深圳、北京、上海、武汉、西安、沈阳、珠海、成都设有全资分公司、生产工厂、办事处。


关于嘉兆
嘉兆简介
荣誉证书
加入团队
荣誉客户
联系我们
我们的品牌
客户服务
在线客服
客户留言
目录索取
设备维修
维修.校准.升级
专业培训
系统服务
设备保养
嘉兆动态
新闻中心
展会活动
基础知识库
其他服务
商城
软件无线电
激光测振仪
友情链接
关注我们
关注嘉兆科技公众号
版权信息
嘉兆科技(CORAD)所发布展示的“产品信息”,“解决方案”版权归嘉兆科技所有,嘉兆科技拥有其代理权。任何收集本站产品信息并未经嘉兆科技许可,嘉兆科技将保留追究侵权者法律责任的权利。
廉洁

粤ICP备06126740号-1 嘉兆网 © Corad Technology Ltd. 始创于1980年