链接中的符号
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中的符号重定义
相关文章推荐
- php闭包bindTo方法用法
- 判断客户端是否是iOS或者Android
- 深入浅出 RecyclerView
- 深入浅出 RecyclerView
- 计算思维实践之路(三)
- python笔记---OS模块内建方法
- 二叉查找树--插入、删除、查找
- kettle日志添加字段的源码修改
- 关于ajax前台验证用户名是否存在
- SQLServer控制用户访问权限表
- Writing an alsa driver译文-第二章 PCI驱动的基本流程
- 使用SAX方式解析XML
- Codeforces 13C Sequence
- What is PRM-DUL?
- Android开发:全面、易懂的Android屏幕适配解决方案
- MYSQL配置
- CSMA/CD 协议
- mysql 用户管理和权限设置
- 使用HttpSessionListener接口监听Session的创建和失效
- UVA - 10112 Myacm Triangles