Skip to main content

Executable

Struct Executable 

Source
pub struct Executable<C: ContextObject> { /* private fields */ }
Expand description

Elf loader/relocator

Implementations§

Source§

impl<C: ContextObject> Executable<C>

Source

pub fn get_config(&self) -> &Config

Get the configuration settings

Source

pub fn get_sbpf_version(&self) -> SBPFVersion

Get the executable sbpf_version

Source

pub fn get_text_bytes(&self) -> (u64, &[u8])

Get the .text section virtual address and bytes

Source

pub fn get_ro_section(&self) -> &[u8]

Get the concatenated read-only sections (including the text section)

Source

pub fn get_ro_region(&self) -> MemoryRegion

Get a memory region that can be used to access the merged readonly section

Source

pub fn get_entrypoint_instruction_offset(&self) -> usize

Get the entry point offset into the text section

Source

pub fn get_loader(&self) -> &Arc<BuiltinProgram<C>>

Get the loader built-in program

Source

pub fn get_compiled_program(&self) -> Option<Arc<JitProgram>>

Get the JIT compiled program

This function will not block the calling thread even if there is a concurrent ongoing call to Self::jit_compile.

Source

pub fn verify<V: Verifier>(&self) -> Result<(), EbpfError>

Verify the executable

Source

pub fn jit_compile(&self) -> Result<(), EbpfError>

JIT compile the executable

This function does not ensure fully sequentially consistent execution ordering between calls to it and related calls such as Self::get_compiled_program or Self::take_compiled_program.

This means that there can be some non-trivial interactions in ordering between calls to this function and a get_compiled_program: concurrent calls to get_compiled_program will return the previous compiled program or None for the duration of the compilation process and is only guaranteed to start returning the newly compiled JitProgram after this function returns.

Source

pub fn take_compiled_program(&self) -> Option<Arc<JitProgram>>

Remove the compiled program.

Note that the results can be unpredictable in presence of concurrent ongoing calls to Self::jit_compile: based on exact execution ordering this function may take out the previous program (or None) that shorly afterwards gets replaced by a compiled program.

Source

pub fn get_function_registry(&self) -> &FunctionRegistry<usize>

Get the function registry

Source

pub fn new_from_text_bytes( text_bytes: &[u8], loader: Arc<BuiltinProgram<C>>, sbpf_version: SBPFVersion, function_registry: FunctionRegistry<usize>, ) -> Result<Self, ElfError>

Create from raw text section bytes (list of instructions)

Source

pub fn load( bytes: &[u8], loader: Arc<BuiltinProgram<C>>, ) -> Result<Self, ElfError>

Fully loads an ELF

Source

pub fn load_with_strict_parser( bytes: &[u8], loader: Arc<BuiltinProgram<C>>, ) -> Result<Self, ElfParserError>

Loads an ELF without relocation

Source

pub fn mem_size(&self) -> usize

Calculate the total memory size of the executable

Source

pub fn validate(elf: &Elf64<'_>, elf_bytes: &[u8]) -> Result<(), ElfError>

Validates the ELF

Source

pub fn parse_ro_sections<'a, S: IntoIterator<Item = (Option<&'a [u8]>, &'a Elf64Shdr)>>( config: &Config, sections: S, elf_bytes: &[u8], ) -> Result<Section, ElfError>

Parses and concatenates the readonly data sections

Source§

impl<C: ContextObject> Executable<C>

Static constructors for Executable

Source

pub fn from_elf( elf_bytes: &[u8], loader: Arc<BuiltinProgram<C>>, ) -> Result<Self, EbpfError>

Creates an executable from an ELF file

Source

pub fn from_text_bytes( text_bytes: &[u8], loader: Arc<BuiltinProgram<C>>, sbpf_version: SBPFVersion, function_registry: FunctionRegistry<usize>, ) -> Result<Self, EbpfError>

Creates an executable from machine code

Trait Implementations§

Source§

impl<C: Debug + ContextObject> Debug for Executable<C>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<C: PartialEq + ContextObject> PartialEq for Executable<C>

Source§

fn eq(&self, other: &Self) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.

Auto Trait Implementations§

§

impl<C> !Freeze for Executable<C>

§

impl<C> RefUnwindSafe for Executable<C>

§

impl<C> Send for Executable<C>

§

impl<C> Sync for Executable<C>

§

impl<C> Unpin for Executable<C>

§

impl<C> UnsafeUnpin for Executable<C>

§

impl<C> UnwindSafe for Executable<C>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V