新闻资讯

查看分类

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

发布时间:2021-08-21 19:09:19  浏览次数: 1248

        一个C程序流程可能是由好几个各自编译程序的一部分构成,这种差异一部分根据一个一般 称为连接器(或射频连接器,载入器)的程序流程合拼成一个总体。由于编译器一般每一次只解决一个文档,因此 它无法检验出一些必须 一次掌握好几个源程序文档才可以发觉的不正确。并且,在很多操作系统中连接器是单独于C语言完成的,因而假如上述情况不正确的缘由与C语言有关,连接器对于此事也一样无计可施。一些C语言完成带来了一个称之为lint的程序流程,能够捕捉到很多的该类不正确,但可惜的是并不是所有的C语言完成都保证了该程序流程。假如可以寻找例如lint的程序流程,就一定善加利用,这一点不管怎样注重都不算过。

C语言中的一个关键观念便是各自编译程序(Separate Compilation),即多个源程序能够在不一样的情况下独立开展编译程序,随后在适当的情况下融合到一起。可是,连接器一般是与C编译器分离出来的,它不太可能掌握C语言的许多关键点。那麼,连接器是怎么保证把多个C源程序合拼成一个总体呢?虽然连接器并不理解C语言,殊不知它却可以了解程序设计语言和运行内存合理布局。编译器的义务便是把C源程序“汉语翻译”成对连接器更有意义的方式,那样连接器就可以“了解”C源程序了。

  典型性的连接器把有编译器或汇编器转化成的多个目标模块,融合成一个被称作载入模块或可执行程序的实体线,该实体线可以被电脑操作系统立即实行。在其中,一些目标模块是立即做为键入给予给连接器的;而此外一些目标模块则是依据连接全过程的必须 ,从包含有相近printf涵数的元件库中得到的。连接器一般 把目标模块当做是一组外界对象(external object)构成的。每一个外界对象意味着着设备运行内存中的某些一部分,并根据一个外界名字来鉴别。因而,程序流程中的每一个涵数和每一个外界自变量,要是没有申明为staTIc,就全是一个外界对象。一些C编译器会对静态函数和静态变量的名字做一定更改,将她们也做为外界对象。因为通过了“名字装饰”,因此 她们不容易与其他原体系文件中的同名的涵数或同名的自变量产生取名矛盾。

  大部分连接器都严禁同一个载入模块中的2个不一样外界对象有着同样的名字。殊不知,在好几个目标模块融合成一个载入模块时,这种目标模块很有可能就包括了重名的外界对象。连接器的一个关键工作中便是解决这类取名矛盾。解决取名矛盾的比较简单的办法便是索性彻底严禁。针对外界对象是涵数的情况,这类作法自然恰当,一个程序流程假如包含2个同名的的不一样涵数,编译器压根便不应当接纳。而针对外界对象是自变量的情况,难题就显得很多艰难了。不一样的连接器对这类情况拥有不一样的处理方法。

  连接器的填写是一组目标模块或是元件库。连接器的輸出是一个载入模块。连接器读取目标模块和元件库,与此同时转化成载入模块。对每一个目标模块中的每一个外界对象,连接器要查验载入模块,看是不是已经有同名的的外界对象。要是没有,连接器就将该外界对象加上到载入模块中;如果有,连接器就需要逐渐解决取名矛盾。

  除开外界对象以外,目标模块中还有可能包含了对别的模块中的外界对象的引入。比如,一个启用了涵数printf的C程序流程所产生的目标模块,就涉及了一个对涵数printf的引入。能够推断得到,该引入偏向的是一个坐落于某一元件库中的外界对象。在连接器转化成载入模块的环节中,它需要与此同时纪录这种外界对象的引入。当连接器读取一个目标模块时,它务必分析出这一目标模块中界定的任何外界对象的引入,并做出标识表明这种外界对象不会再是未定义的。