ELF共享库visibility属性与版本脚本符号隐藏效果差异咨询
问题1解答
nm -D 输出的是 .dynsym 段的内容,该段仅存储动态链接过程中需要用到的导出符号,优先级最高的过滤规则是链接阶段传入的版本脚本:
- 你的版本脚本中仅将
mynamespace下的符号显式标记为导出(global),其余所有符号都命中local: *规则,链接器会直接将这些非导出符号从.dynsym段中剔除,哪怕是模板实例化产生的模糊链接符号也不例外。 objdump -t读取的是.symtab静态符号表,该表会保留编译链接过程中产生的所有符号,不会受导出规则影响,所以仍然能查到fmt相关符号。
模板类静态成员的模糊链接属性只是决定了该符号在多个编译单元重复定义时的合并规则,和是否需要导出到动态符号表没有必然关联,版本脚本的导出规则优先级高于符号本身的默认链接属性。
问题2解答
不会产生冲突,unique global(即ELF标准扩展的STB_GNU_UNIQUE绑定类型)的设计目的就是解决C++模板、内联函数等模糊链接场景下的符号重复问题:
- 动态链接器会保证整个进程空间内,同名同类型的
STB_GNU_UNIQUE符号仅存在唯一一份实例,多个加载的模块如果出现同类型同名的该类符号,会直接合并到第一份加载的实例上,不会触发冲突报错。 - 对比之前的弱符号属性,
STB_GNU_UNIQUE符号无法被LD_PRELOAD覆盖,动态链接器会忽略后续加载的同名同类型STB_GNU_UNIQUE符号,直接复用已有的实例。
内容的提问来源于stack exchange,提问作者VP.
相关产品推荐
相关产品推荐

