设为首页 | 加入收藏
您当前位置:主页 > www.466011.com > 连接器是怎么读懂C源程序的

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

时间:2019-08-03 20:28 来源:未知   点击:

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

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

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

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

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

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

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

  与传统的人工检测和老旧的检测设备相比,X-ray无损检测可以在不损害或不影响被检测对象使用性能,不伤...

  1月21日,Keyssa宣布推出其商业化产品——Kiss Connector,该产品为一种在设备之间...

  据媒体报道,习总书记2014年在上汽考察的时候强调,发展新能源汽车是我国从汽车大国[中国拥有全球...

  在单片机应用开发中,代码的使用效率问题、单片机抗干扰性和可靠性等问题仍困扰着工程师。为帮助工程师解决...

  嵌入式Linux工程师的学习需要具备一定的C语言基础,C语言是嵌入式领域最重要也是最主要的编程语言,...

  电路的核心部分是AT89C2051单片机,前面提到它有Pl和P3两组I/O口,我们这里只用到Pl口,...

  华为的海思芯片虽然也涉及到部分模拟信号处理,特别是它生产的电视机顶盒芯片和视频处理芯片等。但是在智能...

  甲机向乙机发送控制命令字符,甲机同时接收乙机发送的数字,并显示在数码管上。

  【导读】TE是全球最大的连接器供应商,年营收达到131亿美金,其航空航天、防务与船舶事业部也非常厉害...

  今年9月24日美国总统特朗普实行了对大约价值2000亿美元的中国进口产品加征10%的关税,并预从20...

  而作为提供机器人内部连接的线缆和连接器厂商,自然不会错过这个大有前途的朝阳领域。与此同时,工业机器人...

  全球连接与传感器领域领军企业TE Connectivity (TE)今日宣布,凭借行业领先的Sliv...

  全球连接和传感器领域的领导者 TE Connectivity (TE)目前正在应用小尺寸设计和连接速...

  据国家统计局相关数据显示,2018年1-5月份中国工业机器人增长33.7%。可见,工业机器人在工业生...

  倍捷连接器亚洲区总经理徐梦岚说:“为了向用户兑现承诺的可靠性指标,这类民用产品设计师常常直接采用军品...

  浸没式连接器必须满足各种机械和化学限制,SOURIAU长期以来都是这个市场的佼佼者。他们一直不断地调...

  这就是究极形态了,我们添加了第四行的代码,来看&_min1,它的意思是取_min1的地址,而&_mi...

  1. 在汇编中保存现场,然后调用C语言编写的中断处理程序,任务处理完成之后,再返回到汇编中恢复现场,...

  C++是由C语言发展而来的,与C兼容。用C语言写的程序基本上可以不加修改地用于C++。从C++的名字...

  面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用...

  Serial bootloader是一种非常方便使用并且低成本的程序烧写的方法。一般情况,每次烧写M...

  C语言支持递归,即一个函数可以调用其自身。但在使用递归时,程序员需要注意定义一个从函数退出的条件,...

  类型转换可以是隐式的,由编译器自动执行,也可以是显式的,通过使用强制类型转换运算符来指定。在编程时...

  #include 指令会指示 C 预处理器浏览指定的文件作为输入。预处理器的输出包含了已经生成...

  多个命令行参数之间用空格分隔,但是如果参数本身带有空格,那么传递参数的时候应把参数放置在双引号 ...

  但是,如果您预先不知道需要存储的文本长度,例如您向存储有关一个主题的详细描述。在这里,我们需要定义一...

  当然阶段四纯属个人的对未来的推测,但是,近年来,FPGA也高速发展,明显有当年汇编语言开发到C高...

  中美贸易战打响,贸易摩擦加剧,对中国连接器出口公司产生巨大影响。但汇率的贬值对连接器出口企业影响更大...

  移动式机器人系统一直是热议话题,但真正成功的实践还很少,在许多工业企业,它被列为愿望清单中的优先项。...

  从下游企业来看,各个行业的技术升级都会给连接器市场带来新的上升空间,因此连接器行业基本保持了稳定的增...

  通常情况下,使用最多的方法的就是使用rand函数随机生成伪随机数来完成随机数的生成工作。注意这里的伪...

  电源适配器DC插头也简称为DC头,它是电源适配器连接与其供电的产品的一个连接器,它是音叉DC头采取的...

  然而,新产品的展示不仅仅局限于嵌入式视觉领域。Allied Vision还将在此次展会上首发专为具高...

  光纤适配器又称光纤耦合器、光纤法兰盘,各地叫法不同而已。它主要是在光纤显露中实行相同或不同光纤活动连...

  关于光纤适配器,我们也聊过很多了,俗称法兰盘,它主要的能力是将光纤布线系统中的光纤活动连接器连接起来...

  随着4G网络的逐渐普及和消费电子行业的发展,通讯领域网络产品的需求,推动了连接器产品的研发和生产。连...

  光纤适配器又称光纤耦合器、光纤法兰盘,各地叫法不同而已。它主要是在光纤显露中实行相同或不同光纤活动连...

  如果这个函数在读取最后一个字符之前就遇到一个换行符 \n 或文件的末尾 EOF,则只会返回读取到...

  而且搭配OneFit™高度可调节连接器,能够轻松适配您的手机,不需要将手机从保护外壳中取出便能使用。...

  C 语言提供了 typedef 关键字,您可以使用它来为类型取一个新的名字。

  所谓位域是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许...

  C语言中数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型。

  这些紧凑型(10.6mm外径)极化组件具有极轻的重量,但却有坚固的结构设计,因而非常适合于高性能汽车...

  全球连接与传感领域领军企业TEConnectivity(TE)近日宣布推出FPC连接器系统。随着市场...

  全球连接与传感领域领军企业TEConnectivity(TE)近日宣布推出微型同轴电缆连接器。节省空...

  全球连接与传感领域领军企业TE Connectivity (TE)近日宣布推出微型同轴电缆连接器。...

  C语言并不能直接被计算机所理解,需要将C语言转变成可执行代码,即二进制代码。在C语言转变成二进制可执...

  学习 C 语言的指针既简单又有趣。通过指针,可以简化一些 C 编程任务的执行。

  军用连接器龙头企业,军民融合之典范,业绩增速可观。公司是军用连接器的龙头企业,产品谱系完整,在国内连...

  高级驾驶辅助系统(ADAS)是利用安装在车上的各式各样传感器,在汽车行驶过程中随时来感应周围的环境,...

  在单片机应用开发中,代码的使用效率问题、单片机抗干扰性和可靠性等问题仍困扰着。现归纳出单片机开发中应...