0

0

如何使用c++filt工具解析被name mangling过的符号? (符号解码)

尼克

尼克

发布时间:2026-01-18 02:19:07

|

486人浏览过

|

来源于php中文网

原创

c++kquote>c++filt 不生效主因是符号未正确 mangling 或 ABI 不匹配:C 符号(extern "C")、MSVC ABI、缺 _Z 前缀、含空格未加引号等;正确用法需带前缀、单引号包裹,必要时指定 --format。

如何使用c++filt工具解析被name mangling过的符号? (符号解码)

直接用 c++filt 就能还原大多数 GCC/Clang 编译器生成的 mangled 符号,但必须注意输入格式、ABI 版本和模板实例化细节,否则会输出原样或报错。

为什么 c++filt 有时不生效?

常见原因不是工具坏了,而是符号本身没被正确 mangling,或用了非默认 ABI:

  • 符号来自 C 代码(如加了 extern "C")——c++filt 不处理,直接原样输出
  • Clang 默认用 Itanium ABI,但若编译时加了 -fms-extensions 或目标是 Windows(MSVC ABI),c++filt 默认不支持
  • 符号开头缺 _Z(Itanium 标准前缀),比如只粘贴了 4func 这种片段,c++filt 无法识别
  • 符号含空格或特殊字符未转义,shell 直接截断,应加引号

如何正确传入符号并获取可读名?

最稳妥的方式是:确保符号完整、带前缀、用单引号包裹,并显式指定 ABI(如有必要):

c++filt '_Z3fooi'
c++filt --format=gnu-v3 '_ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKSt7__cxx1112basic_stringIS4_S5_T1_E'

关键点:

立即学习C++免费学习笔记(深入)”;

  • Linux/macOS 下符号通常以 _Z 开头(如 _Z3fooifoo(int)),必须保留
  • --format=gnu-v3 是默认值,一般不用写;但若怀疑是旧版 GCC(如 3.x)产出,可加 --format=gnu
  • 批量处理时用 c++filt -n(no strip underscores)避免误删下划线,尤其对内联命名空间有用

从二进制文件里提取并解码符号的典型流程

不能只靠 c++filt 单独工作,它不读文件,需配合 nmobjdumpreadelf

nm -C a.out | grep 'T '     # -C 已启用 demangle,但可能不准

更可靠的是先提取 raw 符号再过滤:

Copy.ai
Copy.ai

Copy.ai 是一个人工智能驱动的文案生成器

下载
nm --defined-only --demangle=none a.out | awk '$2 == "T" {print $3}' | c++filt

说明:

  • --demangle=none 强制 nm 输出原始 mangled 名(避免双重解码)
  • $2 == "T" 只取文本段定义的函数符号(排除调试符号或弱符号)
  • 管道进 c++filt 才做最终解析,可控性高

容易被忽略的模板与匿名命名空间问题

模板实例化和匿名命名空间会导致符号极长,且 c++filt 输出可能仍含编译器内部标识:

c++filt '_ZN1A3fooIiEEvT_'

结果可能是:A::foo(int) —— 注意末尾的 (int) 是参数类型,不是调用,别误以为是函数调用表达式。

匿名命名空间符号(如 _ZN12_GLOBAL__N_13barEv)解码后显示为 (anonymous namespace)::bar(),括号是 c++filt 的约定表示,不是 C++ 语法。

真正麻烦的是带 std:: 内部实现细节的符号(比如 __cxx11),它们在不同 libstdc++ 版本间不兼容,c++filt 能显示但不代表 ABI 兼容。

相关专题

更多
format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

618

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

430

2024.06.27

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

318

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

538

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

52

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

578

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1102

2023.07.27

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.3万人学习

Git 教程
Git 教程

共21课时 | 2.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号