符号注意使用c++filt解析"/>
linux下查看库符号注意使用c++filt解析
个人随笔 (Owed by: 春夜喜雨 )
这篇文档,主要内容就如标题所言:
linux下查看库符号时,注意使用c++filt解析后,再来做grep查找
经验教训
这个问题来源于一个经验教训;
我想查一下libjemalloc库中,是否重载了delete和new方法,初始的时候,使用的这个语句,没有看到重载operator delete方法
$ nm libjemalloc.so|grep delete000000000001f1f0 t je_base_delete0000000000023190 t je_ckh_delete
后来久经波折,才发现库里面是重载了delete方法的,使用下面的语句可以查的到
$ nm libjemalloc.so|c++filt|grep delete000000000001f1f0 t je_base_delete0000000000023190 t je_ckh_delete000000000007a390 T operator delete[](void*)000000000007a3e0 T operator delete[](void*, unsigned long)000000000007a3b0 T operator delete[](void*, std::nothrow_t const&)000000000007a380 T operator delete(void*)000000000007a3c0 T operator delete(void*, unsigned long)000000000007a3a0 T operator delete(void*, std::nothrow_t const&)
为什么会这样呢?
一般我们觉得,c++的库函数,编译后,可能会把函数名、函数类型、参数类型带入函数符号中,grep函数名的话肯定可以找到的。
但实际来看,对于operator重载的符号是做了简化的,使用d代表了delete,使用n代表了new,那使用全词肯定是无法匹配到的。
例如下面的delete重载符号
$ nm libjemalloc.so|grep 000000000007a390000000000007a390 T _ZdaPvnm libjemalloc.so|grep 000000000007a390|c++filt000000000007a390 T operator delete[](void*)
例如下面的new重载符号
$ nm libjemalloc.so|grep 000000000007a320000000000007a320 T _Znam$ nm libjemalloc.so|grep 000000000007a320|c++filt000000000007a320 T operator new[](unsigned long)
所以如果要查看符号时,先还原c++符号,再来查找会比较可靠一些。
个人随笔 (Owed by: 春夜喜雨 )
更多推荐
linux下查看库符号注意使用c++filt解析
发布评论