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

小熊 C++评论4,524字数 787阅读2分37秒阅读模式

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

./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
    nmi | 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
公众号
扫码订阅最新深度技术文,回复【资源】获取技术大礼包
C++最后更新:2020-8-31
小熊