80 lines
1.6 KiB
Rust
80 lines
1.6 KiB
Rust
|
use pyo3::prelude::*;
|
||
|
|
||
|
#[derive(Debug, Clone)]
|
||
|
#[pyclass]
|
||
|
pub struct Section {
|
||
|
#[pyo3(get)]
|
||
|
name: Option<String>,
|
||
|
#[pyo3(get)]
|
||
|
segment: Option<String>,
|
||
|
#[pyo3(get)]
|
||
|
addr: u64,
|
||
|
#[pyo3(get)]
|
||
|
size: u64,
|
||
|
#[pyo3(get)]
|
||
|
offset: u32,
|
||
|
#[pyo3(get)]
|
||
|
align: u32,
|
||
|
#[pyo3(get)]
|
||
|
reloff: u32,
|
||
|
#[pyo3(get)]
|
||
|
nreloc: u32,
|
||
|
#[pyo3(get)]
|
||
|
flags: u32,
|
||
|
}
|
||
|
|
||
|
#[pymethods]
|
||
|
impl Section {
|
||
|
fn __repr__(&self) -> String {
|
||
|
format!("{:?}", self)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
impl From<goblin::mach::segment::Section> for Section {
|
||
|
fn from(section: goblin::mach::segment::Section) -> Self {
|
||
|
Section {
|
||
|
name: section.name().ok().map(|s| s.to_string()),
|
||
|
segment: section.segname().ok().map(|s| s.to_string()),
|
||
|
addr: section.addr,
|
||
|
size: section.size,
|
||
|
offset: section.offset,
|
||
|
align: section.align,
|
||
|
reloff: section.reloff,
|
||
|
nreloc: section.nreloc,
|
||
|
flags: section.flags,
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#[derive(Clone)]
|
||
|
#[pyclass]
|
||
|
pub struct Sections {
|
||
|
pub(crate) sections: Vec<Section>,
|
||
|
}
|
||
|
|
||
|
#[pymethods]
|
||
|
impl Sections {
|
||
|
fn __iter__(slf: PyRef<'_, Self>) -> PyResult<Py<SectionIter>> {
|
||
|
let iter = SectionIter {
|
||
|
inner: slf.sections.clone().into_iter(),
|
||
|
};
|
||
|
Py::new(slf.py(), iter)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#[pyclass]
|
||
|
struct SectionIter {
|
||
|
inner: std::vec::IntoIter<Section>,
|
||
|
}
|
||
|
|
||
|
#[pymethods]
|
||
|
impl SectionIter {
|
||
|
fn __iter__(slf: PyRef<'_, Self>) -> PyRef<'_, Self> {
|
||
|
slf
|
||
|
}
|
||
|
|
||
|
fn __next__(mut slf: PyRefMut<'_, Self>) -> Option<Section> {
|
||
|
slf.inner.next()
|
||
|
}
|
||
|
}
|