您的位置:首页 > 其它

链接中的符号

2016-07-13 14:18 253 查看

一、什么是符号

定义

符号是指代码中的变量与函数。代码中的关键字不属于符号。

种类

符号分为以下4种:

(1)可引出符号

由本模块定义,且能被本模块和其它模块引用的符号

非Static全局函数,非static全局变量都是可引出符号

(2)外部符号

由其它模块定义,但被本模块引用了的符号。

其它模块的可引出符号,如果被本模块使用了,就是本模块的外部符号

外部符号变量由extern修饰

(3)静态符号

由本模块定义,且只能被本模块引用的符号

带static的全局变量和全局函数都是静态符号

(4)局部符号

在函数内部定义的非static变量

种类举例

extern int buf[];
static int *bufp0 = &buf[0];
int *bufp1;
void swap()
{
int temp;
bufp1 = &buf[1];
temp = *bufp0;
*bufp0 = *bufp1;
*bufp1 = temp;
}


运用上面的内容,对这段代码中的符号分类

符号名符号类型
buf外部符号
bufp0静态符号
bufp1可引出符号
swap可引出符号
temp局部符号

二、符号解析

符号解析是指,把符号的定义和引用联系起来。

不同的符号类型,解析的策略不同。为了方便理解,这里打乱次序,从最简单的说起。

- 4.局部符号

链接器对局部符号一点都不关心,因为局部符号是在栈里管理的。

- 3.静态符号

链接器对静态符号的处理比较简单,因为静态符号的定义和引用肯定是在同一个模块中的,只要保证模块中一个符号只有一个定义就好了。

- 2.外部符号

编译器发现模块中的符号没有定义时,就会把它放到一个符号表中,链接器从其它模块中找出这些符号的定义。

- 1.可引出符号

可引出符号的处理比较复杂,要从所有模块中搜索这个符号的定义,还要处理重定义的问题。

三、符号重定义

在外部符号和可引出符号的解析过程中,都有可能遇到符号重定义的问题。

当链接器发现符号重定义时会怎么处理吗?它会报错吗? 不要这么急着下结论。

本着“实践是检验真理的唯一标准”的原则,我们一起做几个实验。

g++/ld中的符号重定义
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: