# pelf [![pelf at crates.io](https://img.shields.io/crates/v/pelf.svg)](https://crates.io/crates/pelf) [![pelf at docs.rs](https://docs.rs/pelf/badge.svg)](https://docs.rs/pelf) A Rust-native library for parsing/generating ELF. ## Getting Started Here's an example that parses elf file and show the attributes of its header. ```rust fn main() { let args: Vec = args().collect(); if args.len() != 2 { panic!("usage: demo ") } let mut f = File::open(&args[1]).expect("failed to open elf-file"); let mut buf = Vec::with_capacity(4096); let _ = f.read_to_end(&mut buf).expect("failed to read elf-file"); let parser = pelf::parser::ElfParserConfig::new().build(); let elf = parser .parse_elf_file(&buf) .expect("failed to parse elf-file"); match elf { pelf::file::ElfFile::Elf64(elf64) => { dump_elf64_file(elf64); } _ => unimplemented!(), } } fn dump_elf64_file(elf: pelf::file::Elf64File) { dump_elf64_header(&elf.header); } fn dump_elf64_header(header: &pelf::header::Elf64Header) { println!("ELF Header:"); println!(" Class: {}", header.ident.class); println!(" Data: {}", header.ident.data); println!(" File Version: {}(Current)", header.ident.version); println!(" Type: {}", header.elf_type); println!(" Machine: {}", header.machine); println!(" Version: 0x{:x}", header.version); println!(" Entry: 0x{:x}", header.entry); println!(" PHT Offset: 0x{:x}", header.phoff); println!(" SHT Offset: 0x{:x}", header.shoff); // println!(" Flags: 0b{:b}", header.e_flags); println!(" PHT Entry Size: 0x{:x}", header.phentsize); println!(" PHT Entries: {}", header.phnum); println!(" SHT Entry Size: 0x{:x}", header.shentsize); println!(" SHT Entries: {}", header.shnum); println!(" Section Header String Table Index: {}", header.shstrndx); } ``` ## features - [x] 64bit ELF object files. - parser - [x] ELF header - [x] section header table - [ ] section(data) - [x] program header table - [ ] symbol table - [ ] dynamic information table - [ ] relocation information table ## Run examples the other examples are placed in [examples](./examples). ```bash # parser example $ cargo run --example demo /usr/bin/ls ```