An open API service indexing awesome lists of open source software.

https://github.com/fitzgen/dwprod


https://github.com/fitzgen/dwprod

Last synced: over 1 year ago
JSON representation

Awesome Lists containing this project

README

          

# dwprod

Find the `DW_AT_producer` for all compilation units within a shared library or
executable.

[![](https://docs.rs/dwprod/badge.svg)](https://docs.rs/dwprod/) [![](http://meritbadge.herokuapp.com/dwprod)](https://crates.io/crates/dwprod) [![](https://img.shields.io/crates/d/dwprod.png)](https://crates.io/crates/dwprod) [![Unix Build Status](https://travis-ci.org/fitzgen/dwprod.png?branch=master)](https://travis-ci.org/fitzgen/dwprod)

#### What is `DW_AT_producer`?

The `DW_AT_producer` is an attribute within DWARF debug info that says what
compiler was used to create each compilation unit that ended up within a given
shared library or executable.

#### Usage

##### As a Library

First, add this to your `Cargo.toml`:

```toml
[dependencies.dwprod]
version = "0.1.0"
# Do not build the command line `dwprod` executable.
default-features = false
```

Then, import the `dwprod` crate and use it to iterate over `DW_AT_producer`
values:

```rust
extern crate dwprod;

fn try_main() -> dwprod::Result<()> {
let opts = dwprod::Options::new("path/to/some/executable");

opts.producers(|producers| {
while let Some(producer) = producers.next()? {
println!("Found DW_AT_producer = {}", producer);
}

Ok(())
})?
}

fn main() {
if let Err(e) = try_main() {
eprintln!("Uh oh! {}", e);
::std::process::exit(1);
}
}
```

The [`fallible-iterator`](https://crates.io/crates/fallible-iterator) crate can
also be used to leverage iterator combinators like `map` and `filter`:

```rust
extern crate dwprod;
extern crate fallible_iterator;

use fallible_iterator::FallibleIterator;
use std::path::Path;

fn each_rustc_producer(
shared_lib_or_exe: &Path,
mut callback: F
) -> dwprod::Result<()>
where
F: FnMut(String)
{
let opts = dwprod::Options::new(shared_lib_or_exe);
opts.producers(|producers| {
producers
// Filter down to only the producers with "rustc" in their name.
.filter(|p| p.contains("rustc"))
// Then map the given callback over each producer.
.map(&mut callback)
// Finally, use `count` to force iteration.
.count()?;

Ok(())
})?
}
```

##### As a Command Line Tool

First, install via `cargo`:

```commands
$ cargo install dwprod
```

Then, run `dwprod path/to/shared/library/or/executable` to get a dump of all of
the `DW_AT_producer` values for each compilation unit within the given shared
library or executable.

Here is the result of running `dwprod` on itself:

```commands
$ dwprod $(which dwprod)
clang LLVM (rustc version 1.22.0-nightly (088216fb9 2017-09-04))
clang LLVM (rustc version 1.22.0-nightly (088216fb9 2017-09-04))
clang LLVM (rustc version 1.22.0-nightly (088216fb9 2017-09-04))
clang LLVM (rustc version 1.22.0-nightly (088216fb9 2017-09-04))
clang LLVM (rustc version 1.22.0-nightly (088216fb9 2017-09-04))
clang LLVM (rustc version 1.22.0-nightly (088216fb9 2017-09-04))
clang LLVM (rustc version 1.22.0-nightly (088216fb9 2017-09-04))
clang LLVM (rustc version 1.22.0-nightly (088216fb9 2017-09-04))
clang LLVM (rustc version 1.22.0-nightly (088216fb9 2017-09-04))
clang LLVM (rustc version 1.22.0-nightly (088216fb9 2017-09-04))
clang LLVM (rustc version 1.22.0-nightly (088216fb9 2017-09-04))
clang LLVM (rustc version 1.22.0-nightly (088216fb9 2017-09-04))
clang LLVM (rustc version 1.22.0-nightly (088216fb9 2017-09-04))
clang LLVM (rustc version 1.22.0-nightly (088216fb9 2017-09-04))
clang LLVM (rustc version 1.22.0-nightly (088216fb9 2017-09-04))
clang LLVM (rustc version 1.22.0-nightly (088216fb9 2017-09-04))
GNU C 4.8.5 -m64 -mtune=generic -march=x86-64 -g3 -O3 -O2 -O2 -std=gnu11 -fvisibility=hidden -funroll-loops -ffunction-sections -fdata-sections -fPIC
GNU C 4.8.5 -m64 -mtune=generic -march=x86-64 -g3 -O3 -O2 -O2 -std=gnu11 -fvisibility=hidden -funroll-loops -ffunction-sections -fdata-sections -fPIC
GNU C 4.8.5 -m64 -mtune=generic -march=x86-64 -g3 -O3 -O2 -O2 -std=gnu11 -fvisibility=hidden -funroll-loops -ffunction-sections -fdata-sections -fPIC
GNU C 4.8.5 -m64 -mtune=generic -march=x86-64 -g3 -O3 -O2 -O2 -std=gnu11 -fvisibility=hidden -funroll-loops -ffunction-sections -fdata-sections -fPIC

```

For more details about the `dwprod` command line tool, run `dwprod --help`.

License: Apache-2.0/MIT