17 releases

0.1.17 Jun 18, 2022
0.1.15 Mar 2, 2021
0.1.14 Nov 21, 2019
0.1.13 Sep 27, 2018
0.1.1 Nov 1, 2016

#369 in Parser implementations

Download history 1034/week @ 2024-06-11 1235/week @ 2024-06-18 1106/week @ 2024-06-25 1671/week @ 2024-07-02 1325/week @ 2024-07-09 1278/week @ 2024-07-16 1296/week @ 2024-07-23 1383/week @ 2024-07-30 1693/week @ 2024-08-06 1124/week @ 2024-08-13 1294/week @ 2024-08-20 991/week @ 2024-08-27 801/week @ 2024-09-03 850/week @ 2024-09-10 1034/week @ 2024-09-17 716/week @ 2024-09-24

3,495 downloads per month
Used in 7 crates (5 directly)

Apache-2.0

235KB
4K SLoC

Contains (Mach-o exe, 320KB) tests/hellorust, (Mach-o exe, 10KB) tests/helloobjc, (Mach-o exe, 9KB) tests/helloworld, (static library, 3KB) tests/libfoo.a

rust-macho travis crate docs

Mach-O File Format Parser for Rust

Usage

To use, add the following line to Cargo.toml under [dependencies]:

mach_object = "0.1"

or alternatively,

mach_object = { git = "https://github.com/flier/rust-macho.git" }

Examples

Use OFile::parse to read the mach-o file from a &[u8] slice.

use std::io::{Read, Cursor};
use std::fs::File;
use mach_object::{OFile, CPU_TYPE_X86_64, MachCommand, LoadCommand};

let mut f = File::open("test/helloworld").unwrap();
let mut buf = Vec::new();
let size = f.read_to_end(&mut buf).unwrap();
let mut cur = Cursor::new(&buf[..size]);
if let OFile::MachFile { ref header, ref commands } = OFile::parse(&mut cur).unwrap() {
    assert_eq!(header.cputype, CPU_TYPE_X86_64);
    assert_eq!(header.ncmds as usize, commands.len());
    for &MachCommand(ref cmd, cmdsize) in commands {
        if let &LoadCommand::Segment64 { ref segname, ref sections, .. } = cmd {
            println!("segment: {}", segname);

            for ref sect in sections {
                println!("  section: {}", sect.sectname);
            }
        }
    }
}

For more detail, please check the unit tests and the otool example.

Dependencies

~0.7–1.5MB
~32K SLoC