记一次c++运行异常 symbol lookup error: xxx.so: undefined symbol: create_hashtable

2020年5月21日15:46:59 发表评论 29 views

在开开心心编译结束以后,发现部分程序运行时异常

./xxx: symbol lookup error: ../bin/xxxx.so: undefined symbol: create_hashtable

确认问题

使用 nm 命令查看此 so

$ nm xxx.so | grep create | grep hash
        U create_hashtable

查看历史正常库文件表现

nm xxx.so  | grep create | grep hash
00000000001cc6a0 T create_hashtable

nm 命令的功能:列出 .o .a .so 中的符号信息,包括诸如符号的值,符号类型及符号名称等。所谓符号,通常指定义出的函数,全局变量等等。

常见的符号类型:

  • A 该符号的值在今后的链接中将不再改变;
  • B 该符号放在BSS段中,通常是那些未初始化的全局变量;
  • D 该符号放在普通的数据段中,通常是那些已经初始化的全局变量;
  • T 该符号放在代码段中,通常是那些全局非静态函数;
  • U 该符号未定义过,需要自其他对象文件中链接进来;
  • W 未明确指定的弱链接符号;同链接的其他对象文件中有它的定义就用上,否则就用一个系统特别指定的默认值。

上面命令有问题的只有一个 U (代表未定义过),没问题的是 T (内部实现了)

尝试修复,找到是哪个组件的问题

写一个简单的脚本,遍历所有的库

for i in `ls` 
do
    echo $i
    nm $i | grep create_hashtable
done

找到了, zkmtzookepper_mt 是同一个组件。

记一次c++运行异常 symbol lookup error: xxx.so: undefined symbol: create_hashtable

对比新老库文件差异

发现原编译方法仅仅使用了 libzkmt.a 库,而上一节已经发现符号 create_hashtable 不在此库中。

nm libzkmt.a | grep create_hashtable
                 U create_hashtable
0000000000000170 T create_hashtable

引入 zookepper_mt 库,重新编译,问题解决

weinxin
微信公众号
三分钟学习晦涩难懂的技术,分享开发、运维、云技术等方面知识,带您轻松打破技术壁垒,编程如鱼得水。欢迎您的关注~!
  • A+
所属分类:C++
小熊

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: