共享库中C++命名空间下模板实例化函数符号查找失败咨询
查找失败的核心原因
- 你执行
nm命令时加的-C参数,作用是对C++编译生成的*修饰后符号(Mangled Symbol)*做反修饰(Demangle),输出的是人类易读的函数签名,这并不是实际存储在ELF共享库中的原始符号名。 - C为了支持命名空间、函数重载、模板等特性,编译器会按照固定的ABI规则(非Windows平台普遍遵循Itanium C ABI)对所有函数符号做名修饰,修饰后的字符串和你在代码中写的函数签名完全不同。你传入反修饰后的签名进行查找,动态链接器无法匹配到真实符号,自然返回空指针。
验证方法
你可以去掉nm命令的-C参数执行:
nm -gD lib.so
输出结果中对应函数位置的长字符串就是真实的符号名,将该字符串作为参数传入符号查找函数即可成功匹配。
补充说明
如果你希望用易读的名称查找符号,可以给目标函数添加extern "C"修饰,强制编译器按照C语言的规则生成无修饰的符号。但需要注意:命名空间下的函数、模板函数本身不支持extern "C"修饰(C语言没有对应语法特性),这类场景下要么直接使用修饰后的符号名查找,要么不要使用动态符号查找的方式获取函数指针。
内容的提问来源于stack exchange,提问作者Stefan Fabian
相关产品推荐
相关产品推荐

