elf_loader 0.17.0

A no_std-friendly ELF loader and runtime linker for Rust.
Documentation
use crate::{IoError, ReadBoundsError, Result};
use alloc::boxed::Box;

#[inline]
#[allow(dead_code)]
fn read_exact_at(
    mut bytes: &mut [u8],
    mut offset: usize,
    mut read_some: impl FnMut(&mut [u8], usize) -> Result<usize>,
) -> Result<()> {
    while !bytes.is_empty() {
        let bytes_to_read = bytes.len();
        let size = read_some(bytes, offset)?;
        if size == 0 {
            return Err(IoError::FailedToFillBuffer.into());
        }
        debug_assert!(size <= bytes_to_read);
        if size > bytes_to_read {
            return Err(IoError::ReadOutOfBounds(Box::new(ReadBoundsError::new(
                offset,
                size,
                usize::MAX,
            )))
            .into());
        }
        offset = offset.checked_add(size).ok_or_else(|| {
            IoError::ReadOutOfBounds(Box::new(ReadBoundsError::new(
                offset,
                bytes_to_read,
                usize::MAX,
            )))
        })?;
        bytes = &mut bytes[size..];
    }
    Ok(())
}

cfg_if::cfg_if! {
    if #[cfg(windows)] {
        mod windows;

        pub use windows::DefaultMmap;
        pub(crate) use windows::{current_thread_id, get_thread_local_ptr, register_thread_destructor};
        pub(crate) use windows::{RawFile, virtual_free};
    } else if #[cfg(any(
        feature = "use-syscall",
        all(any(target_os = "linux", target_os = "android"), feature = "libc"),
    ))] {
        mod linux;

        pub use linux::DefaultMmap;
        pub(crate) use linux::{current_thread_id, get_thread_local_ptr, register_thread_destructor};
        #[allow(unused_imports)]
        pub(crate) use linux::getauxval;
        pub(crate) use linux::RawFile;
    } else {
        mod baremetal;

        pub use super::mmap::AllocMmap as DefaultMmap;
        pub(crate) use baremetal::{current_thread_id, get_thread_local_ptr, register_thread_destructor};
        pub(crate) use baremetal::RawFile;
    }
}