首页 > 代码库 > 符号解析
符号解析
链接器如何解析多重定义的全局符号
在编译时,编译器向会便器输出每个全局符号,汇编器把这些信息隐含地编码在可重定位目标文件的符号表内。函数和初始化的全局变量是强符号,未初始化的全局变量是弱符号。根据强弱符号的定义,unix链接器使用以下规则处理多重定义的符号:1)不允许有多个重定义符号是强符号;2)如果重定义符号中多个是弱符号,一个是强符号,则选择强符号作为该符号的定义;3)如果重定义符号全是弱符号,则在这些弱符号中任选一个作为该符号的定义。
链接器如何使用静态库(static library)解析引用
在符号解析阶段,链接器按照从左到右的顺序扫描在编译驱动程序命令行上出现的可重定位目标文件(relocatable object file)以及存档文件(archive file)。在这个过程中,链接器维持一个可重定位目标文件集合E,一个未解析符号集合U,还有一个已定义符号集合D。三个集合在初始时都是空的。链接器按照如下步骤解析符号:
1)对于命令行上出现的每个文件,链接器会判断该文件是目标文件还是存档文件。如果是目标文件,就将该文件添加到集合E中,并更新集合U和D反映该文件的符号定义与引用情况;如果是存档文件,那么链接器就尝试将集合U中的未解析符号与该文件中定义的符号进行匹配,如果某个未解析符号与存档文件中的一个成员匹配成功,就将该成员文件添加到集合E,并更新集合U和D反映成员文件的符号定义与引用情况。链接器会对存档文件中的所有成员目标文件反复进行这个过程,直到U和D不再变化。此时任何不包含在E中的成员目标文件都被丢弃。链接器接着处理下一个输入文件。
2)如果链接器扫描完命令行上所有的输入文件,而U却是非空的,那么链接器会输出一个错误并终止。否则就会合并E中的所有可重定位目标文件,构建可执行目标文件。
符号解析