静态链接带符号的ELF文件是否可存在两个同名不同属性的符号
静态链接ELF二进制文件同名符号问题解答
带有完整符号信息的静态链接ELF二进制文件中,完全可以存在两个名称完全一致、但属性和指代实体完全不同的符号,常见的可行场景如下:
- 绑定属性不同的同名符号:最典型的是局部符号和全局/弱符号重名,比如A编译单元定义了静态函数
static int calc(int x),对应的是STB_LOCAL类型的局部符号,B编译单元定义了全局函数int calc(int x),对应的是STB_GLOBAL类型的全局符号。静态链接完成后两个符号都会保留在符号表中,分别指向不同的代码段地址,属于完全独立的两个函数实体。 - 符号类型不同的同名符号:同一个名称可以对应不同的符号类型,比如一个符号是STT_FUNC函数类型,另一个是STT_OBJECT变量类型,只要二者不触发链接器的多重定义报错规则,就可以同时保留在符号表中。
- 不同作用域的同名局部符号:多个编译单元各自定义的静态变量、静态函数如果重名,静态链接后都会以STB_LOCAL局部符号的身份保留在符号表中,各自对应不同的段地址,属性也可以存在差异。
补充说明:只有同名符号不触发链接器多重定义校验规则时,才会同时出现在最终ELF的符号表中。如果两个同名符号都是全局强符号,链接阶段会直接抛出多重定义错误,无法生成最终的ELF文件。
内容的提问来源于stack exchange,提问作者OrenIshShalom
相关产品推荐
相关产品推荐

