个人随笔 (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)文章来源地址https://www.toymoban.com/news/detail-682625.html
这篇文档,主要内容就如标题所言:
linux下查看库符号时,注意使用c++filt解析后,再来做grep查找
经验教训
这个问题来源于一个经验教训;
我想查一下libjemalloc库中,是否重载了delete和new方法,初始的时候,使用的这个语句,没有看到重载operator delete方法
$ nm libjemalloc.so|grep delete
000000000001f1f0 t je_base_delete
0000000000023190 t je_ckh_delete
后来久经波折,才发现库里面是重载了delete方法的,使用下面的语句可以查的到
$ nm libjemalloc.so|c++filt|grep delete
000000000001f1f0 t je_base_delete
0000000000023190 t je_ckh_delete
000000000007a390 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 000000000007a390
000000000007a390 T _ZdaPv
nm libjemalloc.so|grep 000000000007a390|c++filt
000000000007a390 T operator delete[](void*)
例如下面的new重载符号
$ nm libjemalloc.so|grep 000000000007a320
000000000007a320 T _Znam
$ nm libjemalloc.so|grep 000000000007a320|c++filt
000000000007a320 T operator new[](unsigned long)
所以如果要查看符号时,先还原c++符号,再来查找会比较可靠一些。文章来源:https://www.toymoban.com/news/detail-682625.html
个人随笔 (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
到了这里,关于linux下查看库符号注意使用c++filt解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!