简介

  • c++filt是C++源码编译后生成二进制文件中符号表中的符号名还原工具。
  • C++语言是允许函数重载的,但是程序中一个函数名只能拥有一个内存地址,为了支持函数重载,c++编译时会在符号表中对函数名进行修改(根据参数类型等信息),因此符号表中的函数名将会变得人眼不可读,如下:
0000000000019176 t _ZL18__gthread_active_pv
00000000000190ad T _ZN10TimeWalker10abstime2tsERKSs

使用

  1. 帮助信息
xxx@chejiser:~$ c++filt -h
Usage: c++filt [options] [mangled names]
Options are:[-_|--strip-underscore]     Ignore first leading underscore[-n|--no-strip-underscore]  Do not ignore a leading underscore (default)[-p|--no-params]            Do not display function arguments[-i|--no-verbose]           Do not show implementation details (if any)[-t|--types]                Also attempt to demangle type encodings[-s|--format {none,auto,gnu,lucid,arm,hp,edg,gnu-v3,java,gnat}][@<file>]                   Read extra options from <file>[-h|--help]                 Display this information[-v|--version]              Show the version information
Demangled names are displayed to stdout.
If a name cannot be demangled it is just echoed to stdout.
If no names are provided on the command line, stdin is read.
Report bugs to <http://www.sourceware.org/bugzilla/>.
  1. 直接跟符号名
$ c++filt _ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7compareEPKc
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::compare(char const*) const
  1. 和nm配合使用
nm xxx.so | xargs c++filt

使用场景

  • 由于C++源码编译后函数名变得不可读,程序链接或者运行时出现的一些错误,程序员就不好定位,如下:
  1. 链接时提示函数undefined问题
  • 有时候,确认了其它条件都正确(路径正确,文件存在,链接正确等),但是链接时依然会提示undefined,可以通过查看符号表的方式来确认undefined的符号名是否存在,C++符号名不可读,可先使用c++filt转换为人眼可读,再进行查找。
nm libxxx.so | xargs c++filt | grep 报错函数名
  1. 运行崩溃,定位问题点
  • 使用backtrace可打印出崩溃时的函数调用栈,但是C++程序打印出的函数名可能是人眼不可读的,因此需要使用c++filt还原回来。
$ ./xxx
stack traceback:
./a.out() [0x401aff]
/lib/x86_64-linux-gnu/libc.so.6(+0x354b0) [0x7fd5f98b54b0]
/lib/x86_64-linux-gnu/libc.so.6(+0x16eff6) [0x7fd5f99eeff6]
/usr/lib/x86_64-linux-gnu/libstdc++.so.6(_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7compareEPKc+0x3a) [0x7fd5f9f9145a]
....
  1. 与汇编代码对应
  • 反汇编后查看汇编代码时,可以将汇编代码和C++代码对应起来,如下:
* 汇编代码movl    -8(%rbp), %edxmovl    -12(%rbp), %eaxmovl    %edx, %esimovl    %eax, %edicall    _Z5myaddii  //调用函数movl    %eax, -4(%rbp)movl    $0, %eax
* 对应C++函数名
$ c++filt _Z5myaddii
myadd(int, int)

Binutils - c++filt工具相关推荐

  1. Binutils工具集 GCC工具集介绍

    GNU Binutils详解:http://www.crifan.com/files/doc/docbook/binutils_intro/release/html/binutils_intro.ht ...

  2. Linux二进制实用工具Binutils工具集解析()

    From:http://blog.csdn.net/zqixiao_09/article/details/50783007 GNU Binutils:http://www.gnu.org/softwa ...

  3. Binutils工具集 解析

    对于嵌入式系统开发,掌握相应的工具至关重要,它能使我们解决问题的效率大大提高.目前,可以说嵌入式系统的开发工具是GNU的天下,因为来自GNU的GCC编译器支持大量的目标处理器.除了GCC,还有一个非常 ...

  4. gnu binutils_9个基本的GNU binutils工具

    gnu binutils 想象一下,虽然无法访问软件的源代码,但仍然能够理解软件的实现方式,在其中找到漏洞,并且可以更好地修复错误. 所有这些都是二进制形式. 听起来像是拥有超级大国,不是吗? 您也可 ...

  5. 嵌入式软件开发杂谈(4):Binutils工具集

    文章目录 1 addr2line 2 nm 3 readelf 3.1 -h 3.2 -l 3.3 -S 3.4 -t 3.5 -s 3.6 -n 3.7 -d 4 size 5 objdump 6 ...

  6. Linux ARM交叉编译工具链制作过程

    一.下载源文件 源代码文件及其版本与下载地址: Binutils-2.19.tar.bz2 http://ftp.gnu.org/gnu/binutils/ gcc-4.4.4.tar.bz2 htt ...

  7. linux 安装toolchain工具

    Cross Toolchain-交叉编译工具链 读者可能会有疑问,为什么要用交叉编译器?交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,比如在PC平台(X86 CPU) ...

  8. 【编译原理】交叉工具链详解

    1.嵌入式开发模型-交叉开发 在嵌入式开发过程中有宿主机和目标机的角色之分,宿主机是执行编译.链接嵌入式软件的计算机,目标机是运行嵌入式软件的硬件平台.在宿主机执行编译的流程如下: 而所谓的交叉编译就 ...

  9. 你知道 GNU Binutils 吗?

    概述 从事 Linux 开发的朋友们都不可避免地用到一些工具,比如 objcopy.nm.objdump.readelf 等等.其实这一系列的工具,就是所谓的 Binutils,当然 GNU 就表示它 ...

  10. 嵌入式开发/调试辅助工具

    开发辅助工具开发环境组成通常开发环境由三部分组成: 构建环境:包括代码编写,程序编译,版本控制等功能. 调试环境:用于定位问题的辅助工具集 测试环境:用于验证目标程序是否满足用户要求的显性需求和隐性需 ...

最新文章

  1. js:appendChild、insertBefore和insertAfter
  2. RabbitMQ消息发送和接收
  3. Linux下脚本实战之系统监控
  4. nw.js启动时白屏
  5. java web输出语句到控制台_Java工程师(6).循环结构
  6. Android输入模拟——如何模拟用户输入
  7. NLP学习02--卷积神经网络CNN
  8. javascript数组特性
  9. 西门子1500和300哪个贵_西门子PLC S7-300和1500之间的通信资源管理之比较?
  10. 禅智听书《精进:如何成为一个很厉害的人》
  11. python爬取同花顺_python 同花顺
  12. 真的是没有底线了,重新认识Java
  13. PaperWeekly 第53期 | 更别致的词向量模型:Simpler GloVe - Part 2
  14. 百度提前批-面试凉凉之-梯度下降
  15. C++一本通1086(角谷猜想)
  16. 使用iso安装linux系统安装教程,使用光盘iso实现Linux操作系统的自动安装部署
  17. 开源项目之杀毒软件 clamwin
  18. windows 7(32/64位)GHO安装指南(系统安装篇)~重点哦!!~~~~
  19. 关于万象跑步机游戏演示
  20. android图案解锁忘了怎么解,安卓手机解锁图案忘了怎么办?手机解锁密码忘了的解决办法...

热门文章

  1. Stream Editor 流编辑器命令
  2. 磁性元件:初始磁导率、有效磁导率、品质因数、矫顽力、电感因数。。。。。
  3. 怎么清理计算机磁盘空间,怎样清理电脑磁盘空间
  4. 不要重新发明轮子_请重新发明轮子
  5. Leetcode 1284 Minimum Number of Flips to Convert Binary Matrix to Zero Matrix
  6. 手写签名制作电子签名详细步骤
  7. js中ajax提交表单提交表单提交,JS中ajax请求提交form表单
  8. 路由的几个基本概念-直连路由/网关路由/主机路由/网络路由/动态路由/静态路由/默认路由
  9. 为什么微信无法打开html文件,微信网页版打不开怎么办?微信网页版无法打开的解决方法...
  10. 程序员学英语之如何优雅的将单词本导出的txt文本转换为Excel