// Haiku implements the image_info struct and the get_next_image_info() // functions to iterate through the loaded executable images. The // image_info struct contains a pointer to the start of the .text // section within the virtual address space, as well as the size of // that section. All the read-only segments of the ELF-binary are in // that part of the address space. use super::mystd::borrow::ToOwned; use super::mystd::ffi::{CStr, OsStr}; use super::mystd::mem::MaybeUninit; use super::mystd::os::unix::prelude::*; use super::{Library, LibrarySegment, Vec}; pub(super) fn native_libraries() -> Vec { let mut libraries: Vec = Vec::new(); unsafe { let mut info = MaybeUninit::::zeroed(); let mut cookie: i32 = 0; // Load the first image to get a valid info struct let mut status = libc::get_next_image_info(libc::B_CURRENT_TEAM, &mut cookie, info.as_mut_ptr()); if status != libc::B_OK { return libraries; } let mut info = info.assume_init(); while status == libc::B_OK { let mut segments = Vec::new(); segments.push(LibrarySegment { stated_virtual_memory_address: 0, len: info.text_size as usize, }); let bytes = CStr::from_ptr(info.name.as_ptr()).to_bytes(); let name = OsStr::from_bytes(bytes).to_owned(); libraries.push(Library { name: name, segments: segments, bias: info.text as usize, }); status = libc::get_next_image_info(libc::B_CURRENT_TEAM, &mut cookie, &mut info); } } libraries }