Skip to content

Commit

Permalink
Generate atos output
Browse files Browse the repository at this point in the history
  • Loading branch information
matux committed Apr 26, 2023
1 parent 07b4c5e commit 0c0deb5
Show file tree
Hide file tree
Showing 8 changed files with 13,160 additions and 20 deletions.
1 change: 0 additions & 1 deletion ators/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,3 @@ uuid = "1.3.1"
anyhow = "1.0.70"
memmap2 = "0.5.10"
object = "0.31.0"
gimli = "0.27.2"
56 changes: 40 additions & 16 deletions ators/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,49 +3,73 @@ use memmap2::Mmap;
use object::Object;
use std::{
env, fs,
io::{self, Write},
io::{self, BufRead, Write},
path::PathBuf,
process::Command,
};

const SYMBOLICATE: &str = "/usr/bin/atos";
const TEST_DWARF: &str = "test.dwarf";
const TEST_ADDRS: &str = "test_addrs.txt";
const TEST_SYMR: &str = "test_symr.txt";

fn main() -> Result<()> {
println!("cargo:rerun-if-changed=../fixtures/test_addrs.txt");
println!("cargo:rerun-if-changed={}", path(TEST_ADDRS)?.display());
println!("cargo:rerun-if-changed={}", path(TEST_SYMR)?.display());

test_addrs_path()?
path(TEST_ADDRS)?
.exists()
.eq(&false)
.then(generate_test_addrs_file);

Ok(())
}
path(TEST_SYMR)?
.exists()
.eq(&false)
.then(generate_test_symr_file);

fn pwd() -> Result<String, env::VarError> {
env::var("CARGO_MANIFEST_DIR")
Ok(())
}

fn test_addrs_path() -> Result<PathBuf, env::VarError> {
Ok([&pwd()?, "..", "fixtures", "test_addrs.txt"]
fn path(file: &str) -> Result<PathBuf> {
Ok([&env::var("CARGO_MANIFEST_DIR")?, "..", "fixtures", file]
.iter()
.collect())
}

fn generate_test_addrs_file() -> Result<()> {
let path = [&pwd()?, "..", "fixtures", "objects", TEST_DWARF]
.iter()
.collect::<PathBuf>();

if !path.exists() {
if !path(TEST_DWARF)?.exists() {
Err(anyhow!("Can't generate test addrs without test.dwarf"))?;
}

let mmap = unsafe { Mmap::map(&fs::File::open(path)?) }?;
let mmap = unsafe { Mmap::map(&fs::File::open(path(TEST_DWARF)?)?) }?;
let object = object::File::parse(&*mmap)?;
let mut addrs_file = io::BufWriter::new(fs::File::create(test_addrs_path()?)?);
let mut addrs_file = io::BufWriter::new(fs::File::create(path(TEST_ADDRS)?)?);

for symbol in object.symbol_map().symbols() {
write!(addrs_file, "{:#018x} ", symbol.address())?;
}

Ok(addrs_file.flush()?)
}

fn generate_test_symr_file() -> Result<()> {
let output = Command::new(SYMBOLICATE)
.args([
"-i",
"-o",
&path(TEST_DWARF)?.to_string_lossy(),
"-s",
"0",
"-f",
&path(TEST_ADDRS)?.to_string_lossy(),
])
.output()?;

let mut symr_file = io::BufWriter::new(fs::File::create(path(TEST_SYMR)?)?);

for symbol in output.stdout.lines() {
writeln!(symr_file, "{}", symbol?)?;
}

Ok(symr_file.flush()?)
}
1 change: 0 additions & 1 deletion fixtures/addresses.txt

This file was deleted.

1 change: 0 additions & 1 deletion fixtures/many_addrs.txt

This file was deleted.

1 change: 0 additions & 1 deletion fixtures/many_addrs_short.txt

This file was deleted.

Binary file added fixtures/test.dwarf
Binary file not shown.
1 change: 1 addition & 0 deletions fixtures/test_addrs.txt

Large diffs are not rendered by default.

13,119 changes: 13,119 additions & 0 deletions fixtures/test_symr.txt

Large diffs are not rendered by default.

0 comments on commit 0c0deb5

Please sign in to comment.