Struct Object

pub struct Object<'a> {
Show 16 fields format: BinaryFormat, architecture: Architecture, sub_architecture: Option<SubArchitecture>, endian: Endianness, sections: Vec<Section<'a>>, standard_sections: HashMap<StandardSection, SectionId>, symbols: Vec<Symbol>, symbol_map: HashMap<Vec<u8>, SymbolId>, comdats: Vec<Comdat>, pub flags: FileFlags, pub mangling: Mangling, stub_symbols: HashMap<SymbolId, SymbolId>, tlv_bootstrap: Option<SymbolId>, macho_cpu_subtype: Option<u32>, macho_build_version: Option<MachOBuildVersion>, macho_subsections_via_symbols: bool,
}
Expand description

A writable relocatable object file.

Fields§

§format: BinaryFormat§architecture: Architecture§sub_architecture: Option<SubArchitecture>§endian: Endianness§sections: Vec<Section<'a>>§standard_sections: HashMap<StandardSection, SectionId>§symbols: Vec<Symbol>§symbol_map: HashMap<Vec<u8>, SymbolId>§comdats: Vec<Comdat>§flags: FileFlags

File flags that are specific to each file format.

§mangling: Mangling

The symbol name mangling scheme.

§stub_symbols: HashMap<SymbolId, SymbolId>§tlv_bootstrap: Option<SymbolId>§macho_cpu_subtype: Option<u32>§macho_build_version: Option<MachOBuildVersion>§macho_subsections_via_symbols: bool

Implementations§

§

impl<'a> Object<'a>

pub fn add_coff_exports(&mut self, style: CoffExportStyle)

Appends linker directives to the .drectve section to tell the linker to export all symbols with SymbolScope::Dynamic.

This must be called after all symbols have been defined.

§

impl<'a> Object<'a>

pub fn add_elf_gnu_property_u32(&mut self, property: u32, value: u32)

Add a property with a u32 value to the ELF “.note.gnu.property” section.

Requires feature = "elf".

§

impl<'a> Object<'a>

pub fn set_macho_cpu_subtype(&mut self, cpu_subtype: u32)

Specify the Mach-O CPU subtype.

Requires feature = "macho".

pub fn set_macho_build_version(&mut self, info: MachOBuildVersion)

Specify information for a Mach-O LC_BUILD_VERSION command.

Requires feature = "macho".

§

impl<'a> Object<'a>

pub fn new( format: BinaryFormat, architecture: Architecture, endian: Endianness, ) -> Object<'a>

Create an empty object file.

pub fn format(&self) -> BinaryFormat

Return the file format.

pub fn architecture(&self) -> Architecture

Return the architecture.

pub fn sub_architecture(&self) -> Option<SubArchitecture>

Return the sub-architecture.

pub fn set_sub_architecture( &mut self, sub_architecture: Option<SubArchitecture>, )

Specify the sub-architecture.

pub fn mangling(&self) -> Mangling

Return the current mangling setting.

pub fn set_mangling(&mut self, mangling: Mangling)

Specify the mangling setting.

pub fn segment_name(&self, segment: StandardSegment) -> &'static [u8]

Return the name for a standard segment.

This will vary based on the file format.

pub fn section(&self, section: SectionId) -> &Section<'a>

Get the section with the given SectionId.

pub fn section_mut(&mut self, section: SectionId) -> &mut Section<'a>

Mutably get the section with the given SectionId.

pub fn set_section_data<T>(&mut self, section: SectionId, data: T, align: u64)
where T: Into<Cow<'a, [u8]>>,

Set the data for an existing section.

Must not be called for sections that already have data, or that contain uninitialized data. align must be a power of two.

pub fn append_section_data( &mut self, section: SectionId, data: &[u8], align: u64, ) -> u64

Append data to an existing section. Returns the section offset of the data.

Must not be called for sections that contain uninitialized data. align must be a power of two.

pub fn append_section_bss( &mut self, section: SectionId, size: u64, align: u64, ) -> u64

Append zero-initialized data to an existing section. Returns the section offset of the data.

Must not be called for sections that contain initialized data. align must be a power of two.

pub fn section_id(&mut self, section: StandardSection) -> SectionId

Return the SectionId of a standard section.

If the section doesn’t already exist then it is created.

pub fn add_section( &mut self, segment: Vec<u8>, name: Vec<u8>, kind: SectionKind, ) -> SectionId

Add a new section and return its SectionId.

This also creates a section symbol.

pub fn add_subsection( &mut self, section: StandardSection, name: &[u8], ) -> SectionId

Add a subsection. Returns the SectionId and section offset of the data.

For Mach-O, this does not create a subsection, and instead uses the section from Self::section_id. Use Self::set_subsections_via_symbols to enable subsections via symbols.

pub fn set_subsections_via_symbols(&mut self)

Enable subsections via symbols if supported.

This should be called before adding any subsections or symbols.

For Mach-O, this sets the MH_SUBSECTIONS_VIA_SYMBOLS flag. For other formats, this does nothing.

pub fn default_section_flags(&self, section: &Section<'_>) -> SectionFlags

Return the default flags for a section.

The default flags are the section flags that will be written if the section flags are set to SectionFlags::None. These flags are determined by the file format and fields in the section such as the section kind.

This may return SectionFlags::None if the file format does not support the section kind.

pub fn section_flags(&self, section: &Section<'_>) -> SectionFlags

Return the flags for a section.

If section.flags is SectionFlags::None, then returns Self::default_section_flags. Otherwise, section.flags is returned as is.

pub fn section_flags_mut(&mut self, section_id: SectionId) -> &mut SectionFlags

Mutably get the flags for a section.

If section.flags is SectionFlags::None, then replace it with Self::default_section_flags first. Otherwise, &mut section.flags is returned as is.

pub fn comdat(&self, comdat: ComdatId) -> &Comdat

Get the COMDAT section group with the given ComdatId.

pub fn comdat_mut(&mut self, comdat: ComdatId) -> &mut Comdat

Mutably get the COMDAT section group with the given ComdatId.

pub fn add_comdat(&mut self, comdat: Comdat) -> ComdatId

Add a new COMDAT section group and return its ComdatId.

pub fn symbol_id(&self, name: &[u8]) -> Option<SymbolId>

Get the SymbolId of the symbol with the given name.

pub fn symbol(&self, symbol: SymbolId) -> &Symbol

Get the symbol with the given SymbolId.

pub fn symbol_mut(&mut self, symbol: SymbolId) -> &mut Symbol

Mutably get the symbol with the given SymbolId.

pub fn add_symbol(&mut self, symbol: Symbol) -> SymbolId

Add a new symbol and return its SymbolId.

If the symbol is a section symbol that is already defined, it will update the flags of the existing section symbol instead of creating adding a new symbol.

The symbol name will be modified to include the global prefix if the mangling scheme has one.

pub fn default_symbol_flags( &self, symbol: &Symbol, ) -> SymbolFlags<SectionId, SymbolId>

Return the default flags for a symbol.

The default flags are the symbol flags that will be written if the symbol flags are set to SymbolFlags::None. These flags are determined by the file format and fields in the symbol such as the symbol kind and scope. Therefore you should call this function after the symbol has been fully defined.

This may return SymbolFlags::None if the file format does not support symbol flags, or does not support the symbol kind or scope.

pub fn symbol_flags(&self, symbol: &Symbol) -> SymbolFlags<SectionId, SymbolId>

Return the flags for a symbol.

If symbol.flags is SymbolFlags::None, then returns Self::default_symbol_flags. Otherwise, symbol.flags is returned as is.

pub fn symbol_flags_mut( &mut self, symbol_id: SymbolId, ) -> &mut SymbolFlags<SectionId, SymbolId>

Mutably get the flags for a symbol.

If symbol.flags is SymbolFlags::None, then replace it with Self::default_symbol_flags. Otherwise, &mut symbol.flags is returned as is.

pub fn has_uninitialized_tls(&self) -> bool

Return true if the file format supports StandardSection::UninitializedTls.

pub fn has_common(&self) -> bool

Return true if the file format supports StandardSection::Common.

pub fn add_common_symbol( &mut self, symbol: Symbol, size: u64, align: u64, ) -> SymbolId

Add a new common symbol and return its SymbolId.

For Mach-O, this appends the symbol to the __common section.

align must be a power of two.

pub fn add_file_symbol(&mut self, name: Vec<u8>) -> SymbolId

Add a new file symbol and return its SymbolId.

pub fn section_symbol(&mut self, section_id: SectionId) -> SymbolId

Get the symbol for a section.

pub fn add_symbol_data( &mut self, symbol_id: SymbolId, section: SectionId, data: &[u8], align: u64, ) -> u64

Append data to an existing section, and update a symbol to refer to it.

For Mach-O, this also creates a __thread_vars entry for TLS symbols, and the symbol will indirectly point to the added data via the __thread_vars entry.

For Mach-O, if Self::set_subsections_via_symbols is enabled, this will automatically ensure the data size is at least 1.

Returns the section offset of the data.

Must not be called for sections that contain uninitialized data. align must be a power of two.

pub fn add_symbol_bss( &mut self, symbol_id: SymbolId, section: SectionId, size: u64, align: u64, ) -> u64

Append zero-initialized data to an existing section, and update a symbol to refer to it.

For Mach-O, this also creates a __thread_vars entry for TLS symbols, and the symbol will indirectly point to the added data via the __thread_vars entry.

For Mach-O, if Self::set_subsections_via_symbols is enabled, this will automatically ensure the data size is at least 1.

Returns the section offset of the data.

Must not be called for sections that contain initialized data. align must be a power of two.

pub fn set_symbol_data( &mut self, symbol_id: SymbolId, section: SectionId, offset: u64, size: u64, )

Update a symbol to refer to the given data within a section.

For Mach-O, this also creates a __thread_vars entry for TLS symbols, and the symbol will indirectly point to the data via the __thread_vars entry.

pub fn symbol_section_and_offset( &mut self, symbol_id: SymbolId, ) -> Option<(SymbolId, u64)>

Convert a symbol to a section symbol and offset.

Returns None if the symbol does not have a section.

pub fn add_relocation( &mut self, section: SectionId, relocation: Relocation, ) -> Result<(), Error>

Add a relocation to a section.

Relocations must only be added after the referenced symbols have been added and defined (if applicable).

pub fn write(&self) -> Result<Vec<u8>, Error>

Write the object to a Vec.

pub fn write_stream<W>(&self, w: W) -> Result<(), Box<dyn Error>>
where W: Write,

Write the object to a Write implementation.

Also flushes the writer.

It is advisable to use a buffered writer like BufWriter instead of an unbuffered writer like File.

pub fn emit(&self, buffer: &mut dyn WritableBuffer) -> Result<(), Error>

Write the object to a WritableBuffer.

Trait Implementations§

§

impl<'a> Debug for Object<'a>

§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'a> Freeze for Object<'a>

§

impl<'a> RefUnwindSafe for Object<'a>

§

impl<'a> Send for Object<'a>

§

impl<'a> Sync for Object<'a>

§

impl<'a> Unpin for Object<'a>

§

impl<'a> UnwindSafe for Object<'a>

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
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
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
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Returns the layout of the type.
§

impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
where T: SharedNiching<N1, N2>, N1: Niching<T>, N2: Niching<T>,

§

unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool

Returns whether the given value has been niched. Read more
§

fn resolve_niched(out: Place<NichedOption<T, N1>>)

Writes data to out indicating that a T is niched.
§

impl<T> Pointee for T

§

type Metadata = ()

The metadata type for pointers and references to this type.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
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<T> Upcastable for T
where T: Any + Send + Sync + 'static,

Source§

fn upcast_any_ref(&self) -> &(dyn Any + 'static)

upcast ref
Source§

fn upcast_any_mut(&mut self) -> &mut (dyn Any + 'static)

upcast mut ref
Source§

fn upcast_any_box(self: Box<T>) -> Box<dyn Any>

upcast boxed dyn