符号和符号表
C程序员使用static属性隐藏块内部的变量和函数声明,就像你在java和C++
中使用public和private声明一样。
每个可重定位目标模块m都有一个符号表,它包含m定义和引用的符号的信息。
在连接器的上下文中,有三种不同的符号:
1)由模块m定义并能被其他模块引用的全局符号。
2)由其他模块定义并被模块m引用的全局符号。
3)只被模块m定义和应用的局部符号。static
连接器如何解析多重定义的全局符号
函数和已初始化的全局变量是强符号,为初始化的全局变量是若符号
规则1:不允许有多个同名的强符号。
规则2:如果有一个强符号和多个弱符号同名,那么选择强符号
规则3:如果有多个弱符号同名,那么从这些弱符号
与静态库连接
实际上,所有的编译系统提供一种机制,将所有相关的目标模块打包称为一个单独的文件,
称为静态库(static library),它可以用做连接器的输入。
当连接器构造一个输出的可执行文件时,它只复制静态库里被应用程序引用的目标模块。
这种方法的有点是它将编译器的实现与标准函数的实现分离开来,并且仍然对程序员
保持适度的便利。
在Linux系统中,静态库以一种称为存档(archive)的特殊文件格式存放在磁盘中。