在开开心心编译结束以后,发现部分程序运行时异常
./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
找到了, zkmt
和 zookepper_mt
是同一个组件。
对比新老库文件差异
发现原编译方法仅仅使用了 libzkmt.a
库,而上一节已经发现符号 create_hashtable
不在此库中。
nm libzkmt.a | grep create_hashtable
U create_hashtable
0000000000000170 T create_hashtable
引入 zookepper_mt
库,重新编译,问题解决
公众号
扫码订阅最新深度技术文,回复【资源】获取技术大礼包
评论