Skip to content

Instantly share code, notes, and snippets.

@mitsuhiko
Created May 4, 2017 11:56
Show Gist options
  • Save mitsuhiko/14cac563206f5108875e41f6b907d6cf to your computer and use it in GitHub Desktop.
Save mitsuhiko/14cac563206f5108875e41f6b907d6cf to your computer and use it in GitHub Desktop.
pub fn get_variants(&self) -> Result<Vec<Variant>> {
let mut rv = vec![];
match self.ofile {
OFile::FatFile { ref files, .. } => {
for &(_, ref file) in files {
extract_variants(&mut rv, file);
}
}
OFile::MachFile { .. } => {
extract_variants(&mut rv, &self.ofile);
}
_ => {}
}
return Ok(rv);
fn extract_variants<'a>(rv: &'a mut Vec<Variant>, file: &'a OFile) {
if let &OFile::MachFile { ref header, ref commands, .. } = file {
let mut variant_uuid = Uuid::nil();
let mut variant_name = "<unknown>";
let mut variant_vmaddr = 0;
let mut variant_vmsize = 0;
for &MachCommand(ref load_cmd, _) in commands {
match load_cmd {
&LoadCommand::Uuid(uuid) => {
variant_uuid = uuid;
},
&LoadCommand::IdDyLib(DyLib { ref name, .. }) => {
variant_name = &name.1;
}
&LoadCommand::Segment { ref segname, vmaddr, vmsize, .. } => {
if segname == "__TEXT" {
variant_vmaddr = vmaddr as u64;
variant_vmsize = vmsize as u64;
}
}
&LoadCommand::Segment64 { ref segname, vmaddr, vmsize, .. } => {
if segname == "__TEXT" {
variant_vmaddr = vmaddr as u64;
variant_vmsize = vmsize as u64;
}
}
_ => {}
}
}
rv.push(Variant {
cpu_name: get_arch_name_from_types(header.cputype,
header.cpusubtype)
.unwrap_or("<unknown>"),
uuid: variant_uuid,
name: variant_name,
vmaddr: variant_vmaddr,
vmsize: variant_vmsize,
})
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment