Skip to content

Commit

Permalink
Merge pull request #1 from softdevteam/initial
Browse files Browse the repository at this point in the history
A small Rust wrapper around `dl_iterate_phdr(3)`.
  • Loading branch information
ltratt authored Oct 3, 2018
2 parents e314401 + 4223a53 commit 5e2fa32
Show file tree
Hide file tree
Showing 8 changed files with 493 additions and 0 deletions.
5 changes: 5 additions & 0 deletions .rustfmt.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
indent_style="Block"
imports_indent="Block"
use_try_shorthand=true
use_field_init_shorthand=true
merge_imports=true
17 changes: 17 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
language: rust
rust: stable
cache: cargo

before_script:
- export PATH="$PATH:$HOME/.cargo/bin"

script:
# Installing rustfmt stops auto-generated code from being all dumped on one
# line. This is problematic because it can cause warnings to be so long
# that Travis terminates the build.
- rustup component add rustfmt-preview
- cargo build
- cargo build --examples
- cargo doc --no-deps
- cargo test
- ./target/debug/examples/dump_phdrs
10 changes: 10 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
[package]
name = "phdrs"
version = "0.1.0"
authors = ["Edd Barrett <vext01@gmail.com>"]

[dependencies]
libc = "0.2"

[build-dependencies]
bindgen = "0.41"
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Phdrs

A thin wrapper around `dl_iterate_phdr(3)` allowing easier inspection of the
program headers from Rust programs.
58 changes: 58 additions & 0 deletions build.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
// Copyright (c) 2018 King's College London
// created by the Software Development Team <http://soft-dev.org/>
//
// The Universal Permissive License (UPL), Version 1.0
//
// Subject to the condition set forth below, permission is hereby granted to any
// person obtaining a copy of this software, associated documentation and/or
// data (collectively the "Software"), free of charge and under any and all
// copyright rights in the Software, and any and all patent rights owned or
// freely licensable by each licensor hereunder covering either (i) the
// unmodified Software as contributed to or provided by such licensor, or (ii)
// the Larger Works (as defined below), to deal in both
//
// (a) the Software, and
// (b) any piece of software and/or hardware listed in the lrgrwrks.txt file
// if one is included with the Software (each a "Larger Work" to which the Software
// is contributed by such licensors),
//
// without restriction, including without limitation the rights to copy, create
// derivative works of, display, perform, and distribute the Software and make,
// use, sell, offer for sale, import, export, have made, and have sold the
// Software and the Larger Work(s), and to sublicense the foregoing rights on
// either these or other terms.
//
// This license is subject to the following condition: The above copyright
// notice and either this complete permission notice or at a minimum a reference
// to the UPL must be included in all copies or substantial portions of the
// Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.

extern crate bindgen;

use std::{env, path::PathBuf};

const BINDINGS_FILE: &'static str = "bindings.rs";
const WRAPPER_HEADER: &'static str = "wrapper.h";

fn main() {
// Rust target spec is needed for now so that auto-generated tests pass.
// https://github.com/rust-lang-nursery/rust-bindgen/issues/1370#issuecomment-426597356
let bindings = bindgen::Builder::default()
.header(WRAPPER_HEADER)
.rust_target(bindgen::RustTarget::Stable_1_26)
.generate()
.expect("bindgen failed");

let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
bindings
.write_to_file(out_path.join(BINDINGS_FILE))
.expect("Couldn't write bindings!");
}
49 changes: 49 additions & 0 deletions examples/dump_phdrs.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
// Copyright (c) 2018 King's College London
// created by the Software Development Team <http://soft-dev.org/>
//
// The Universal Permissive License (UPL), Version 1.0
//
// Subject to the condition set forth below, permission is hereby granted to any
// person obtaining a copy of this software, associated documentation and/or
// data (collectively the "Software"), free of charge and under any and all
// copyright rights in the Software, and any and all patent rights owned or
// freely licensable by each licensor hereunder covering either (i) the
// unmodified Software as contributed to or provided by such licensor, or (ii)
// the Larger Works (as defined below), to deal in both
//
// (a) the Software, and
// (b) any piece of software and/or hardware listed in the lrgrwrks.txt file
// if one is included with the Software (each a "Larger Work" to which the Software
// is contributed by such licensors),
//
// without restriction, including without limitation the rights to copy, create
// derivative works of, display, perform, and distribute the Software and make,
// use, sell, offer for sale, import, export, have made, and have sold the
// Software and the Larger Work(s), and to sublicense the foregoing rights on
// either these or other terms.
//
// This license is subject to the following condition: The above copyright
// notice and either this complete permission notice or at a minimum a reference
// to the UPL must be included in all copies or substantial portions of the
// Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.

extern crate phdrs;

use phdrs::objects;

fn main() {
for o in objects() {
println!("{:?}", o);
for p in o.iter_phdrs() {
println!(" {:?}", p);
}
}
}
Loading

0 comments on commit 5e2fa32

Please sign in to comment.