符号表保存的不只是名字
目标文件里的符号表把名字与类型、绑定属性、可见性和所属节等信息联系起来。尚无定义的引用可标为未定义符号;已经定义的符号值也要结合文件类别理解,在可重定位文件中常是节内偏移,而非最终运行地址。
局部符号只在相应目标文件内有意义,别的文件出现同名局部符号并不自动冲突。全局符号则可参与文件间解析。源语言的名字查找与二进制链接的符号选择处在不同阶段,不能把源码作用域规则原样套到链接器上。
参考:[1]
强弱绑定需要说明适用阶段
在ELF静态链接编辑把可重定位文件合并的规则中,同名全局定义重复通常构成错误,全局定义相对于弱定义有优先地位。未定义弱符号还有特殊处理;弱绑定因此并非另一种“链接失败就随便选”的策略。
运行时动态符号查找还有自身顺序和对象范围。ELF通用ABI描述从可执行程序及依赖顺序展开的查找,也规定可见性等因素的作用。静态强弱规则不能直接当作所有运行时加载器的完整选择算法。
选对名字仍需匹配接口
名字与地址解析成功,不代表调用方和被调用方的数据布局、参数传递或版本约定一致。符号表提供的是链接所需的一部分身份信息,ABI不匹配仍可能让程序在成功装入后出错。
符号解析与重定位也不能合并成一个概念。前者确定引用对应的定义,后者再依据机器格式、地址和加数形成具体编码。诊断未定义符号、重复定义与地址修正问题时,应分别核对这几个阶段。