Board logo

标题: 编译器的几个概念-符号法则,强符号”和“弱符号,“强引用”和“弱引用” [打印本页]

作者: m1_ljp    时间: 2010-11-17 09:02     标题: 编译器的几个概念-符号法则,强符号”和“弱符号,“强引用”和“弱引用”

编译器的几个概念-符号法则,强符号”和“弱符号,“强引用”和“弱引用”
符号法则





强符号弱符号的概念:

很多时候,用户可能并不希望使用现有库中的函数而是使用自己定义的同名库函数,这就要求允许不同程序模块中存在相同名字的函数定义——这就是强符号弱符号的概念;

对于C/C++编译器,在本目标文件中定义的函数和初始化了的全局变量为强符号,本目标文件中定义的未初始化全局变量为弱符号,而在本目标文件中使用extern引用的符号不属于强弱符号定义的范畴。链接器工作时,不允许各个模块中出现同名的强符号,而当仅有一个模块中为强符号其他模块中为弱符号时,链接器选择强符号;如果只存在多个弱符号链接器选择占用空间最大的那个——这种情况必须避免,否则错误难以发现。弱符号往往使用在库中,GCC下可以通过 __attribute__((weak))
关键字显式地定义一个弱符号。

强引用弱引用的概念:
系统中某些扩展功能模块可能时有时无,如果要求系统在两种情况下都能正常工作,这就需要在功能模块不存在时主程序中对这些扩展功能模块的引用不能报错——这就是强引用弱引用的概念。

则模块A引用模块B的一个函数时,如果模块B的这个函数不存在时,模块A不报错

默认地,本模块中所有对外部符号的引用在链接时都是强引用,该符号必须能够被正确决议(理解为绑定的同义词),否则链接器就会报错;GCC中可以通过 __attribute__ ((weakref))
关键字显式地将对一个外部符号的应用定义为弱引用,这样即使在链接的时候该符号并没有正确地找到定义,链接器也不会报错,而只是将该符号的符号值(st_value)置为0,但是这样得到的可执行程序在执行时会出错,因为当调用弱符号时,弱符号地址为0,属于非法访问。因此在程序中调用一个外部符号时,应该先判断其值是否为0,若不为0再进行调用。





欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0