2024-04-02 00:05:22 +11:00
|
|
|
use std::{fs, path::PathBuf};
|
2024-04-01 23:26:48 +11:00
|
|
|
|
2024-04-02 00:05:22 +11:00
|
|
|
use addr2line::{gimli, object};
|
2024-04-01 23:26:48 +11:00
|
|
|
use clap::Parser;
|
2024-04-02 00:10:23 +11:00
|
|
|
use colored::Colorize;
|
2024-04-01 23:26:48 +11:00
|
|
|
|
|
|
|
#[derive(Parser, Debug)]
|
|
|
|
#[command(version, about, long_about = None)]
|
|
|
|
struct Args {
|
|
|
|
/// The filename of the elf file
|
|
|
|
elf_path: PathBuf,
|
|
|
|
|
|
|
|
/// The output of agb's dump
|
|
|
|
dump: String,
|
|
|
|
}
|
|
|
|
|
2024-04-01 23:43:08 +11:00
|
|
|
struct Location {
|
|
|
|
filename: String,
|
|
|
|
line: u32,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Default for Location {
|
|
|
|
fn default() -> Self {
|
|
|
|
Self {
|
|
|
|
filename: "??".to_string(),
|
|
|
|
line: 0,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-04-01 23:26:48 +11:00
|
|
|
fn main() -> anyhow::Result<()> {
|
|
|
|
let cli = Args::parse();
|
|
|
|
|
|
|
|
let file = fs::read(cli.elf_path)?;
|
|
|
|
let object = object::File::parse(file.as_slice())?;
|
|
|
|
|
|
|
|
let ctx = addr2line::Context::new(&object)?;
|
|
|
|
|
2024-04-02 00:05:22 +11:00
|
|
|
for address in cli.dump.split('-') {
|
|
|
|
let mut address = u64::from_str_radix(address, 16)?;
|
|
|
|
if address <= 0xFFFF {
|
|
|
|
address += 0x0800_0000;
|
|
|
|
}
|
|
|
|
|
|
|
|
print_address(&ctx, address)?;
|
|
|
|
}
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
fn print_address(ctx: &addr2line::Context<impl gimli::Reader>, address: u64) -> anyhow::Result<()> {
|
|
|
|
let mut frames = ctx.find_frames(address).skip_all_loads()?;
|
2024-04-01 23:43:08 +11:00
|
|
|
|
|
|
|
while let Some(frame) = frames.next()? {
|
|
|
|
let function_name = if let Some(func) = frame.function {
|
|
|
|
func.demangle()?.into_owned()
|
|
|
|
} else {
|
|
|
|
"unknown function".to_string()
|
|
|
|
};
|
|
|
|
|
|
|
|
let location = frame
|
|
|
|
.location
|
|
|
|
.map(|location| Location {
|
|
|
|
filename: location.file.unwrap_or("??").to_owned(),
|
|
|
|
line: location.line.unwrap_or(0),
|
|
|
|
})
|
|
|
|
.unwrap_or_default();
|
2024-04-01 23:26:48 +11:00
|
|
|
|
2024-04-02 00:10:23 +11:00
|
|
|
println!(
|
|
|
|
"{}\n\t{}:{}",
|
|
|
|
function_name.white(),
|
|
|
|
location.filename.green(),
|
|
|
|
location.line.to_string().green()
|
|
|
|
);
|
2024-04-01 23:26:48 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|