Skip to content

Commit fe8e702

Browse files
authored
Arch-independent demangling and add gnuv2_demangle for old g++ projects (#262)
1 parent e2c7034 commit fe8e702

File tree

14 files changed

+132
-79
lines changed

14 files changed

+132
-79
lines changed

Cargo.lock

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

objdiff-core/Cargo.toml

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ any-arch = [
4141
"dep:regex",
4242
"dep:similar",
4343
"dep:syn",
44-
"dep:encoding_rs"
44+
"dep:encoding_rs",
45+
"demangler",
4546
]
4647
bindings = [
4748
"dep:prost",
@@ -88,38 +89,37 @@ std = [
8889
]
8990
mips = [
9091
"any-arch",
91-
"dep:cpp_demangle",
92-
"dep:cwdemangle",
9392
"dep:rabbitizer",
9493
]
9594
ppc = [
9695
"any-arch",
97-
"dep:cwdemangle",
9896
"dep:cwextab",
9997
"dep:powerpc",
10098
"dep:rlwinmdec",
10199
]
102100
x86 = [
103101
"any-arch",
104-
"dep:cpp_demangle",
105102
"dep:iced-x86",
106-
"dep:msvc-demangler",
107103
]
108104
arm = [
109105
"any-arch",
110106
"dep:arm-attr",
111-
"dep:cpp_demangle",
112107
"dep:unarm",
113108
]
114109
arm64 = [
115110
"any-arch",
116-
"dep:cpp_demangle",
117111
"dep:yaxpeax-arch",
118112
"dep:yaxpeax-arm",
119113
]
120114
superh = [
121115
"any-arch",
122116
]
117+
demangler = [
118+
"dep:cpp_demangle",
119+
"dep:cwdemangle",
120+
"dep:gnuv2_demangle",
121+
"dep:msvc-demangler",
122+
]
123123

124124
[package.metadata.docs.rs]
125125
features = ["all"]
@@ -150,7 +150,6 @@ gimli = { git = "https://github.com/gimli-rs/gimli", rev = "7335f00e7c39fd501511
150150
typed-arena = { version = "2.0", default-features = false, optional = true }
151151

152152
# ppc
153-
cwdemangle = { version = "1.0", optional = true }
154153
cwextab = { version = "1.1", optional = true }
155154
powerpc = { version = "0.4", optional = true }
156155
rlwinmdec = { version = "1.1", optional = true }
@@ -159,9 +158,7 @@ rlwinmdec = { version = "1.1", optional = true }
159158
rabbitizer = { version = "2.0.0-alpha.4", default-features = false, features = ["all_extensions"], optional = true }
160159

161160
# x86
162-
cpp_demangle = { version = "0.4", default-features = false, features = ["alloc"], optional = true }
163161
iced-x86 = { version = "1.21", default-features = false, features = ["decoder", "intel", "gas", "masm", "nasm", "exhaustive_enums", "no_std"], optional = true }
164-
msvc-demangler = { version = "0.11", optional = true }
165162

166163
# arm
167164
unarm = { version = "1.9", optional = true }
@@ -179,6 +176,12 @@ tempfile = { version = "3.20", optional = true }
179176
time = { version = "0.3", optional = true }
180177
encoding_rs = { version = "0.8.35", optional = true }
181178

179+
# demangler
180+
cpp_demangle = { version = "0.4", optional = true, default-features = false, features = ["alloc"] }
181+
cwdemangle = { version = "1.0", optional = true }
182+
gnuv2_demangle = { version = "0.1.0", optional = true }
183+
msvc-demangler = { version = "0.11", optional = true }
184+
182185
[target.'cfg(windows)'.dependencies]
183186
winapi = { version = "0.3", optional = true, features = ["winbase"] }
184187

objdiff-core/config-schema.json

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,37 @@
2525
}
2626
]
2727
},
28+
{
29+
"id": "demangler",
30+
"type": "choice",
31+
"default": "auto",
32+
"name": "Demangler",
33+
"description": "Which demangler should be used to demangle each symbol.",
34+
"items": [
35+
{
36+
"value": "auto",
37+
"name": "Auto",
38+
"description": "Try to automatically guess the mangling format."
39+
},
40+
{
41+
"value": "codewarrior",
42+
"name": "CodeWarrior"
43+
},
44+
{
45+
"value": "msvc",
46+
"name": "MSVC"
47+
},
48+
{
49+
"value": "itanium",
50+
"name": "Itanium"
51+
},
52+
{
53+
"value": "gnu_legacy",
54+
"name": "GNU g++ (Legacy)",
55+
"description": "Use the old GNU mangling ABI. Used up to g++ 2.9.x"
56+
}
57+
]
58+
},
2859
{
2960
"id": "analyzeDataFlow",
3061
"type": "boolean",
@@ -259,6 +290,7 @@
259290
"name": "General",
260291
"properties": [
261292
"functionRelocDiffs",
293+
"demangler",
262294
"spaceBetweenArgs",
263295
"combineDataSections",
264296
"combineTextSections"

objdiff-core/src/arch/arm.rs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,4 @@
1-
use alloc::{
2-
collections::BTreeMap,
3-
format,
4-
string::{String, ToString},
5-
vec::Vec,
6-
};
1+
use alloc::{collections::BTreeMap, format, string::ToString, vec::Vec};
72

83
use anyhow::{Result, bail};
94
use arm_attr::{BuildAttrs, enums::CpuArch, tag::Tag};
@@ -409,12 +404,6 @@ impl Arch for ArchArm {
409404
}
410405
}
411406

412-
fn demangle(&self, name: &str) -> Option<String> {
413-
cpp_demangle::Symbol::new(name)
414-
.ok()
415-
.and_then(|s| s.demangle(&cpp_demangle::DemangleOptions::default()).ok())
416-
}
417-
418407
fn reloc_name(&self, flags: RelocationFlags) -> Option<&'static str> {
419408
match flags {
420409
RelocationFlags::Elf(r_type) => match r_type {

objdiff-core/src/arch/arm64.rs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
1-
use alloc::{
2-
format,
3-
string::{String, ToString},
4-
vec::Vec,
5-
};
1+
use alloc::{format, string::ToString, vec::Vec};
62
use core::cmp::Ordering;
73

84
use anyhow::Result;
@@ -108,12 +104,6 @@ impl Arch for ArchArm64 {
108104
Ok(())
109105
}
110106

111-
fn demangle(&self, name: &str) -> Option<String> {
112-
cpp_demangle::Symbol::new(name)
113-
.ok()
114-
.and_then(|s| s.demangle(&cpp_demangle::DemangleOptions::default()).ok())
115-
}
116-
117107
fn reloc_name(&self, flags: RelocationFlags) -> Option<&'static str> {
118108
match flags {
119109
RelocationFlags::Elf(r_type) => match r_type {

objdiff-core/src/arch/mips.rs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use alloc::{
22
collections::{BTreeMap, BTreeSet},
3-
string::{String, ToString},
3+
string::ToString,
44
vec::Vec,
55
};
66

@@ -304,13 +304,6 @@ impl Arch for ArchMips {
304304
}
305305
}
306306

307-
fn demangle(&self, name: &str) -> Option<String> {
308-
cpp_demangle::Symbol::new(name)
309-
.ok()
310-
.and_then(|s| s.demangle(&cpp_demangle::DemangleOptions::default()).ok())
311-
.or_else(|| cwdemangle::demangle(name, &cwdemangle::DemangleOptions::default()))
312-
}
313-
314307
fn reloc_name(&self, flags: RelocationFlags) -> Option<&'static str> {
315308
match flags {
316309
RelocationFlags::Elf(r_type) => match r_type {

objdiff-core/src/arch/mod.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -371,8 +371,6 @@ pub trait Arch: Any + Debug + Send + Sync {
371371
Ok(None)
372372
}
373373

374-
fn demangle(&self, _name: &str) -> Option<String> { None }
375-
376374
fn reloc_name(&self, _flags: RelocationFlags) -> Option<&'static str> { None }
377375

378376
fn data_reloc_size(&self, flags: RelocationFlags) -> usize;

objdiff-core/src/arch/ppc/mod.rs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -308,18 +308,6 @@ impl Arch for ArchPpc {
308308
}
309309
}
310310

311-
fn demangle(&self, mut name: &str) -> Option<String> {
312-
if name.starts_with('?') {
313-
msvc_demangler::demangle(name, msvc_demangler::DemangleFlags::llvm()).ok()
314-
} else {
315-
name = name.trim_start_matches('.');
316-
cpp_demangle::Symbol::new(name)
317-
.ok()
318-
.and_then(|s| s.demangle(&cpp_demangle::DemangleOptions::default()).ok())
319-
.or_else(|| cwdemangle::demangle(name, &cwdemangle::DemangleOptions::default()))
320-
}
321-
}
322-
323311
fn reloc_name(&self, flags: RelocationFlags) -> Option<&'static str> {
324312
match flags {
325313
RelocationFlags::Elf(r_type) => match r_type {

objdiff-core/src/arch/superh/mod.rs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use alloc::{collections::BTreeMap, format, string::String, vec, vec::Vec};
1+
use alloc::{collections::BTreeMap, format, vec, vec::Vec};
22

33
use anyhow::Result;
44
use object::elf;
@@ -132,12 +132,6 @@ impl Arch for ArchSuperH {
132132
Ok(())
133133
}
134134

135-
fn demangle(&self, name: &str) -> Option<String> {
136-
cpp_demangle::Symbol::new(name)
137-
.ok()
138-
.and_then(|s| s.demangle(&cpp_demangle::DemangleOptions::default()).ok())
139-
}
140-
141135
fn reloc_name(&self, flags: RelocationFlags) -> Option<&'static str> {
142136
match flags {
143137
RelocationFlags::Elf(r_type) => match r_type {

objdiff-core/src/arch/x86.rs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use alloc::{boxed::Box, format, string::String, vec::Vec};
1+
use alloc::{boxed::Box, format, vec::Vec};
22
use core::cmp::Ordering;
33

44
use anyhow::{Context, Result, anyhow, bail};
@@ -300,16 +300,6 @@ impl Arch for ArchX86 {
300300
Ok(Some(RelocationOverride { target: RelocationOverrideTarget::Keep, addend }))
301301
}
302302

303-
fn demangle(&self, name: &str) -> Option<String> {
304-
if name.starts_with('?') {
305-
msvc_demangler::demangle(name, msvc_demangler::DemangleFlags::llvm()).ok()
306-
} else {
307-
cpp_demangle::Symbol::new(name)
308-
.ok()
309-
.and_then(|s| s.demangle(&cpp_demangle::DemangleOptions::default()).ok())
310-
}
311-
}
312-
313303
fn reloc_name(&self, flags: RelocationFlags) -> Option<&'static str> {
314304
match self.arch {
315305
Architecture::X86 => match flags {

0 commit comments

Comments
 (0)