文章目录

  • 1.命令简介
  • 2.命令格式
  • 3.选项说明
  • 4.常用示例
  • 参考文献

大咖好呀,我是恋喵大鲤鱼。

!!! 我的第二本开源书籍《后台开发命令365》上线啦,欢迎大家协同共建。
!!! 我的第二本开源书籍《后台开发命令365》上线啦,欢迎大家协同共建。
!!! 我的第二本开源书籍《后台开发命令365》上线啦,欢迎大家协同共建。

1.命令简介

c++filt 可用于解析 C++ 和 Java 中被修饰的符号,比如变量与函数名称。

我们知道, 在 C++ 和 Java 中, 允许函数重载,也就是说我们可以写出多个同名但参数类型不同的函数,其实现依赖于编译器的名字改编(Name Mangling)机制,即编译器会将函数的名称进行修饰,加入参数信息。考察如下程序:

//
//@file:print.cpp
//#include <iostream>
#include <string>
using namespace std;const int dTest=0;void print(const string& strElfFileName)
{std::cout<<"readelf "<<strElfFileName<<std::endl;
}

使用 g++ 编译上面的 print.cpp 生成目标文件 print.o。

g++ -c print.cpp -o print.o

然后使用命令 strings 查找 print.o 中的可打印字符串。

strings print.o
readelf
GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-4)
.symtab
.strtab
.shstrtab
.rela.text
.data
.bss
.rodata
.rela.init_array
.comment
.note.GNU-stack
.rela.eh_frame
print.cpp
_ZStL8__ioinit
_Z41__static_initialization_and_destruction_0ii
_ZL5dTest
_GLOBAL__sub_I__Z5printRKSs
_Z5printRKSs
_ZSt4cout
_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
_ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E
_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
_ZNSolsEPFRSoS_E
_ZNSt8ios_base4InitC1Ev
__dso_handle
_ZNSt8ios_base4InitD1Ev
__cxa_atexit

找到其中两个字符串,分别是_ZL5dTest_Z5printRKSs ,根据其包含的内容,我们大致能够猜测,两个字符串分别对应源码中的常量 dTest 和函数 print()。使用 c++filt 进行符号解析(symbol demangling)来验证我们的猜想。

c++filt _ZL5dTest
dTestc++filt _Z5printRKSs
print(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)

猜测正确,源码文件中的变量名和函数名被修饰后,通过 c++filt 命令可以还原回来,这正是 c++filt 命令的功能。

2.命令格式

c++filt [-_|--strip-underscore][-n|--no-strip-underscore][-p|--no-params][-t|--types][-i|--no-verbose][-s format|--format=format][--help]  [--version]  [symbol...]

注意,如果没有给出符号参数 [symbol…],c++filt 将从标准输入中读取符号名称。

3.选项说明

-_, --strip-underscore在某些系统中,C和C++编译器都在每个名字前面加下划线。例如,C 名称 foo 获得低级名称为 _foo。此选项用于删除初始下划线,c++filt 是否默认删除下划线是依赖于目标的
-n, --no-strip-underscore不删除初始下划线
-p, --no-params当解析函数名时,不显示函数参数的类型
-t, --types试图解析类型与函数名
-i, --no-verbose输出结果中不包括任何实现细节
-s, --format=FORMATc++filt 可以解析不同编译器修饰的符号,此选项用于指明符号修饰所采用的方法:"auto":根据可执行文件自动选择符号解析方法,此为默认选项"gnu": GNU C++ compiler (g++)的符号修饰方法"lucid": Lucid compiler (lcc)的符号修饰方法"arm":C++ Annotated Reference Manual 指明的方法"hp":HP compiler (aCC)的符号修饰方法"edg":EDG compiler 的符号修饰方法"gnu-v3":GNU C++ compiler (g++) with the V3 ABI 的符号修饰方法"java":GNU Java compiler (gcj)的符号修饰方法"gnat":GNU Ada compiler (GNAT) 的符号修饰方法
--help显示帮助信息
--version显示版本信息
@FILE从文件 FILE 中读取命令行选项,读取的选项将插入到 @FILE 选项的位置。如果文件不存在,或者无法读取,那么选项 @FILE 将被按照字面意义处理,而不是被忽略

4.常用示例

(1)解析编译器 g++ 修饰的函数名称。还是以第一节“1.命令简介”中函数 print() 的名字为例。

c++filt -s gnu-v3 _Z5printRKSs
print(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)

(2)解析编译器 g++ 修饰的函数名称,但不显示函数参数类型。

c++filt -p _Z5printRKSs
print

(3)解析编译器 g++ 修饰的变量名称。还是以第一节“1.命令简介”中变量 dTest 的名字为例。

c++filt _ZL5dTest
dTest

参考文献

c++filt(1) - Linux manual page - man7.org
mangle和demangle

c++filt command相关推荐

  1. Linux命令:c++filt

    1 需求 2 语法 Usage: c++filt [options] [mangled names] Options are:[-_|--strip-underscore] Ignore first ...

  2. mongo报错:not authorized on bb to execute command { create: \“xxx\“...}

    mongo报错: {"ok" : 0,"errmsg" : "not authorized on bb to execute command { cr ...

  3. pip install nmslib 失败 (error: command ‘x86_64-linux-gnu-gcc‘ failed with exit status 1)

    1. 问题现象 使用 pip 安装 nmslib 命令时出现如下错误: sudo pip install nmslib ....ERROR: Complete output from command ...

  4. 解决 win10 pycurl安装出错 Command python setup.py egg_info failed with error code 10 编译安装包 安装万金油...

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/yexiaohhjk/article/d ...

  5. bash: vue: command not found

    安装vue的时候提示:bash: vue: command not found 我的原因node.js 环境变量配置有问题,最后添加了环境变量就好了..........

  6. -bash: fultter: command not found

    flutter build apk bash: flutter: command not found 在studio中的控制台出现上面错误(如图所示) 解决办法: 安装flutter时,安装时可以执行 ...

  7. jenkins 插件执行shell命令时,提示“Command not found”处理方法

    首先提示找不到"Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具 ...

  8. python mysql gcc_MySQL-python “error: command 'gcc' failed with exit status 1”错误

    安装MySQL-python-1.2.3c1出现"error: command 'gcc' failed with exit status 1"错误 具体报错信息如下: _mysq ...

  9. 在Ubuntu 16.04.6 LTS上安装python3.7和pip3后出现Command '('lsb_release', '-a')' 出错问题的解决方法

    在Ubuntu 16.04.6 LTS上安装python3.7和pip3后出现Command '('lsb_release', '-a')' returned non-zero exit status ...

最新文章

  1. net项目总结一(1)
  2. AndroidAsync
  3. mac 安装cmake
  4. 为什么待办事项清单不管用
  5. c6x Linux 内核中断分析
  6. HDOJ 1002 A + B Problem II 解题报告
  7. php获取时间格式的年份,PHP获取当前时间、时间戳的各种格式写法汇总
  8. SpringBoot项目实现配置实时刷新功能
  9. 300G的python资料等着你
  10. Ubuntu+CUDA+OpenCV+Caffee安装
  11. Manjaro安装教程
  12. 7939.com,7b.com.cn,9505.com,4199.com 清除工具(转)
  13. Java实现 LeetCode 109 有序链表转换二叉搜索树
  14. python模拟登录qq邮箱爬取_python模拟登录qq邮箱
  15. 启用计算机的无线同屏,Windows10如何使用无线同屏功能?
  16. python之panda模块1
  17. 在商城项目开发中怎么保证促销商品不会超卖
  18. AI专业教您保姆级在暗影精灵8Windows11上本地部署实现AI绘画:Stable Diffusion(万字教程,多图预警)
  19. 能玩游戏的计算机名字,适合玩大型游戏的笔记本电脑排行榜前十名
  20. qt中制作添加 .ts 翻译文件

热门文章

  1. 技术人写公众号为啥没人看?
  2. 图的深度优先遍历(DFS)和广度优先遍历(BFS)非递归实现C++
  3. 【直播回放PPT】企业架构与数字化转型
  4. android tv 长布局,高手的学习笔记!给Android TV做设计要注意的16个细节
  5. 听觉神经网络(一):听觉系统的结构与功能
  6. vue微信分享中相关问题(安卓分享成功,IOS分享失效)
  7. Android ImageView播放gif图片
  8. IE浏览器点击下载文件
  9. Pr-PEI 蛋白质-聚乙烯亚胺/Glu-PEI 葡萄糖-聚乙烯亚胺/E1105-PEI 溶菌酶-聚乙烯亚胺
  10. LFSR(线性反馈移位寄存器, Linear-feedback shift register