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调试

Download history 213628/week @ 2024-04-22 175664/week @ 2024-04-29 182830/week @ 2024-05-06 209012/week @ 2024-05-13 209173/week @ 2024-05-20 207890/week @ 2024-05-27 200953/week @ 2024-06-03 198433/week @ 2024-06-10 199918/week @ 2024-06-17 211273/week @ 2024-06-24 186132/week @ 2024-07-01 203490/week @ 2024-07-08 224055/week @ 2024-07-15 228790/week @ 2024-07-22 206904/week @ 2024-07-29 208743/week @ 2024-08-05

878,091 每月下载量
517 个 crate (25 直接) 中使用

MIT/Apache

460KB
10K SLoC

cpp_demangle: C++ 链接器符号解名器

Build Status

此 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"]
}

文档

在docs.rs上的文档

示例程序

  • c++filt 克隆。

    使用以下命令本地安装它

    cargo install cpp_demangle --example cppfilt
    

实现状态

工作正在进行中。虽然 cpp_demangle 可以解析 libiberty 的解模糊器测试套件中的每个模糊符号(这是由 GNU 工具(如 c++filt)使用的标准 Itanium C++ 符号解模糊器),但它并不以字符对字符的方式格式化所有符号。我正在修复这个问题 ;)

尽管如此,我相信 cpp_demangle 相当稳健。我已经在 cpp_demangle 上运行了 AFL 一整夜,而且很长时间没有发现任何恐慌(而且从未发现任何崩溃 -- 谢谢 Rust!)

许可

根据您的选择,许可如下

贡献

有关黑客攻击,请参阅 CONTRIBUTING.md

除非您明确声明,否则任何有意提交以包含在您的工作中的贡献,根据 Apache-2.0 许可证定义,应以上述双许可方式提供,不附加任何额外条款或条件。

依赖关系

~0–1.3MB