1
Fork 0
oelf/src/sections.rs

79 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()
}
}