linux下查看库符号注意使用c++filt解析

编程入门 行业动态 更新时间:2024-10-06 11:31:09

linux下查看库<a href=https://www.elefans.com/category/jswz/34/1770893.html style=符号注意使用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解析

本文发布于:2024-02-14 07:17:55,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1762374.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:符号   linux   filt

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!