26 个版本
0.4.3 | 2023 年 8 月 18 日 |
---|---|
0.4.2 | 2023 年 6 月 26 日 |
0.4.1 | 2023 年 4 月 14 日 |
0.4.0 | 2022 年 10 月 20 日 |
0.1.0 | 2016 年 12 月 11 日 |
#25 在 调试 中
878,091 每月下载量
在 517 个 crate (25 直接) 中使用
460KB
10K SLoC
cpp_demangle
: C++ 链接器符号解名器
此 crate 可以解析 C++ 的“混淆”链接器符号名称,将其解析为 Rust 值,描述名称所引用的内容:变量、函数、虚表等。描述类型实现了 Display
,生成描述混淆名称的文本。调试器和性能分析器可以使用此 crate 来提供更有意义的输出。
C++ 要求编译器在编译单元之间一致地选择链接器符号的名称,以便两个看到相同声明的编译单元可以将一个单元中的定义与另一个单元中的引用配对。除微软 Windows 之外,几乎所有平台都遵循 Itanium C++ ABI 的规则。
例如,假设一个 C++ 编译单元有定义
namespace space {
int foo(int x, int y) { return x+y; }
}
Itanium C++ ABI 规定该函数的链接器符号必须命名为 _ZN5space3fooEii
。此 crate 可以将该名称解析为表示其结构的 Rust 值。使用 format!
宏或 std::string::ToString::to_string
特性方法格式化值,将生成字符串 space::foo(int, int)
,这对 C++ 开发者来说更有意义。
使用方法
将 cpp_demangle
添加到您的crate的 Cargo.toml
[dependencies]
cpp_demangle = "0.4.3"
然后解模糊一些C++符号!
extern crate cpp_demangle;
use cpp_demangle::Symbol;
use std::string::ToString;
let mangled = b"_ZN5space3fooEibc";
let sym = Symbol::new(&mangled[..])
.expect("Could not parse mangled symbol!");
let demangled = sym.to_string();
assert_eq!(demangled, "space::foo(int, bool, char)");
no_std
支持
cpp_demangle
可以配置在 no_std
环境中工作,这些环境仍然通过 alloc
crate 支持分配。目前,这仅适用于nightly rust,因为 alloc
crate 的集合尚未稳定。
禁用 "std" 特性,并启用 "alloc" 特性
[dependencies]
cpp_demangle = {
version = "0.4.3",
default-features = false,
features = ["alloc"]
}
文档
示例程序
-
使用以下命令本地安装它
cargo install cpp_demangle --example cppfilt
实现状态
工作正在进行中。虽然 cpp_demangle
可以解析 libiberty
的解模糊器测试套件中的每个模糊符号(这是由 GNU 工具(如 c++filt
)使用的标准 Itanium C++ 符号解模糊器),但它并不以字符对字符的方式格式化所有符号。我正在修复这个问题 ;)
尽管如此,我相信 cpp_demangle
相当稳健。我已经在 cpp_demangle
上运行了 AFL 一整夜,而且很长时间没有发现任何恐慌(而且从未发现任何崩溃 -- 谢谢 Rust!)
许可
根据您的选择,许可如下
- Apache License,版本 2.0 (
LICENSE-APACHE
或 https://www.apache.org/licenses/LICENSE-2.0) - MIT 许可证 (
LICENSE-MIT
或 https://opensource.org/licenses/MIT)
。
贡献
有关黑客攻击,请参阅 CONTRIBUTING.md
除非您明确声明,否则任何有意提交以包含在您的工作中的贡献,根据 Apache-2.0 许可证定义,应以上述双许可方式提供,不附加任何额外条款或条件。
依赖关系
~0–1.3MB