Expose segments
This commit is contained in:
parent
53708c2bb4
commit
6dba4064f2
14
src/lib.rs
14
src/lib.rs
|
@ -10,12 +10,14 @@ mod exports;
|
||||||
mod header;
|
mod header;
|
||||||
mod imports;
|
mod imports;
|
||||||
mod sections;
|
mod sections;
|
||||||
|
mod segments;
|
||||||
mod symbols;
|
mod symbols;
|
||||||
|
|
||||||
use exports::Export;
|
use exports::Export;
|
||||||
use header::Header;
|
use header::Header;
|
||||||
use imports::Import;
|
use imports::Import;
|
||||||
use sections::{Section, Sections};
|
use sections::{Section, Sections};
|
||||||
|
use segments::Segment;
|
||||||
use symbols::Symbols;
|
use symbols::Symbols;
|
||||||
|
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
|
@ -100,13 +102,23 @@ impl Object {
|
||||||
Symbols::from(self.macho().symbols())
|
Symbols::from(self.macho().symbols())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn segments(&self) -> Vec<Segment> {
|
||||||
|
self.macho()
|
||||||
|
.segments
|
||||||
|
.into_iter()
|
||||||
|
.map(|seg| seg.into())
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
fn sections(&self) -> Sections {
|
fn sections(&self) -> Sections {
|
||||||
let macho = self.macho();
|
let macho = self.macho();
|
||||||
let mut sections = vec![];
|
let mut sections = vec![];
|
||||||
|
let mut idx = 0;
|
||||||
for sect_iter in macho.segments.sections() {
|
for sect_iter in macho.segments.sections() {
|
||||||
sections.extend(sect_iter.map(|section| {
|
sections.extend(sect_iter.map(|section| {
|
||||||
|
idx += 1;
|
||||||
let (sect, _data) = section.unwrap();
|
let (sect, _data) = section.unwrap();
|
||||||
Section::from(sect)
|
Section::from((idx, sect))
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
Sections { sections }
|
Sections { sections }
|
||||||
|
|
|
@ -3,6 +3,8 @@ use pyo3::prelude::*;
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
pub struct Section {
|
pub struct Section {
|
||||||
|
#[pyo3(get)]
|
||||||
|
index: usize,
|
||||||
#[pyo3(get)]
|
#[pyo3(get)]
|
||||||
name: Option<String>,
|
name: Option<String>,
|
||||||
#[pyo3(get)]
|
#[pyo3(get)]
|
||||||
|
@ -30,9 +32,10 @@ impl Section {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<goblin::mach::segment::Section> for Section {
|
impl From<(usize, goblin::mach::segment::Section)> for Section {
|
||||||
fn from(section: goblin::mach::segment::Section) -> Self {
|
fn from((index, section): (usize, goblin::mach::segment::Section)) -> Self {
|
||||||
Section {
|
Section {
|
||||||
|
index,
|
||||||
name: section.name().ok().map(|s| s.to_string()),
|
name: section.name().ok().map(|s| s.to_string()),
|
||||||
segment: section.segname().ok().map(|s| s.to_string()),
|
segment: section.segname().ok().map(|s| s.to_string()),
|
||||||
addr: section.addr,
|
addr: section.addr,
|
||||||
|
|
54
src/segments.rs
Normal file
54
src/segments.rs
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
use pyo3::prelude::*;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
#[pyclass]
|
||||||
|
pub struct Segment {
|
||||||
|
#[pyo3(get)]
|
||||||
|
cmd: u32,
|
||||||
|
#[pyo3(get)]
|
||||||
|
cmdsize: u32,
|
||||||
|
#[pyo3(get)]
|
||||||
|
name: Option<String>,
|
||||||
|
#[pyo3(get)]
|
||||||
|
vmaddr: u64,
|
||||||
|
#[pyo3(get)]
|
||||||
|
vmsize: u64,
|
||||||
|
#[pyo3(get)]
|
||||||
|
fileoff: u64,
|
||||||
|
#[pyo3(get)]
|
||||||
|
filesize: u64,
|
||||||
|
#[pyo3(get)]
|
||||||
|
maxprot: u32,
|
||||||
|
#[pyo3(get)]
|
||||||
|
initprot: u32,
|
||||||
|
#[pyo3(get)]
|
||||||
|
nsects: u32,
|
||||||
|
#[pyo3(get)]
|
||||||
|
flags: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[pymethods]
|
||||||
|
impl Segment {
|
||||||
|
fn __repr__(&self) -> String {
|
||||||
|
format!("{:?}", self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<&goblin::mach::segment::Segment<'_>> for Segment {
|
||||||
|
fn from(segm: &goblin::mach::segment::Segment) -> Self {
|
||||||
|
let segname = segm.name().ok().map(|s| s.to_string());
|
||||||
|
Segment {
|
||||||
|
cmd: segm.cmd,
|
||||||
|
cmdsize: segm.cmdsize,
|
||||||
|
name: segname,
|
||||||
|
vmaddr: segm.vmaddr,
|
||||||
|
vmsize: segm.vmsize,
|
||||||
|
fileoff: segm.fileoff,
|
||||||
|
filesize: segm.filesize,
|
||||||
|
maxprot: segm.maxprot,
|
||||||
|
initprot: segm.initprot,
|
||||||
|
nsects: segm.nsects,
|
||||||
|
flags: segm.flags,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
4
test.py
4
test.py
|
@ -27,6 +27,10 @@ print("imports")
|
||||||
for imp in g.imports():
|
for imp in g.imports():
|
||||||
print(imp)
|
print(imp)
|
||||||
|
|
||||||
|
print("segments")
|
||||||
|
for segment in g.segments():
|
||||||
|
print(f"{segment}")
|
||||||
|
|
||||||
print("sections")
|
print("sections")
|
||||||
for section in g.sections():
|
for section in g.sections():
|
||||||
print(f"{section}")
|
print(f"{section}")
|
||||||
|
|
Loading…
Reference in a new issue