use crate::ffi::plthook_enum;
use libc::c_uint;
use std::ffi::{CStr, CString};
use std::mem::MaybeUninit;
#[derive(Debug)]
pub struct Symbol {
pub name: CString,
pub func_address: *const fn(),
}
pub(crate) fn iterator(object: &crate::ObjectFile) -> SymbolIterator {
SymbolIterator { pos: 0, object }
}
pub(crate) struct SymbolIterator<'a> {
pos: c_uint,
object: &'a crate::ObjectFile,
}
impl<'a> Iterator for SymbolIterator<'a> {
type Item = Symbol;
fn next(&mut self) -> Option<Symbol> {
let mut name = MaybeUninit::uninit();
let mut func_address = MaybeUninit::uninit();
let ret = unsafe {
plthook_enum(
self.object.0.c_object,
&mut self.pos,
name.as_mut_ptr(),
func_address.as_mut_ptr() as *mut _,
)
};
if ret != 0 {
return None;
}
let name = unsafe { CStr::from_ptr(name.assume_init()).into() };
let func_address = unsafe { func_address.assume_init() };
Some(Symbol { name, func_address })
}
}