Struct object::write::Object

source ·
pub struct Object<'a> {
    pub flags: FileFlags,
    pub mangling: Mangling,
    /* private fields */
}
Expand description

A writable relocatable object file.

Fields§

§flags: FileFlags

File flags that are specific to each file format.

§mangling: Mangling

The symbol name mangling scheme.

Implementations§

source§

impl<'a> Object<'a>

source

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.

source§

impl<'a> Object<'a>

source

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".

source§

impl<'a> Object<'a>

source

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

Specify the Mach-O CPU subtype.

Requires feature = "macho".

source

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

Specify information for a Mach-O LC_BUILD_VERSION command.

Requires feature = "macho".

source§

impl<'a> Object<'a>

source

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

Create an empty object file.

source

pub fn format(&self) -> BinaryFormat

Return the file format.

source

pub fn architecture(&self) -> Architecture

Return the architecture.

source

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

Return the sub-architecture.

source

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

Specify the sub-architecture.

source

pub fn mangling(&self) -> Mangling

Return the current mangling setting.

source

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

Specify the mangling setting.

source

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

Return the name for a standard segment.

This will vary based on the file format.

source

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

Get the section with the given SectionId.

source

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

Mutably get the section with the given SectionId.

source

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.

source

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.

source

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.

source

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.

source

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.

source

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.

source

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.

source

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

Get the COMDAT section group with the given ComdatId.

source

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

Mutably get the COMDAT section group with the given ComdatId.

source

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

Add a new COMDAT section group and return its ComdatId.

source

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

Get the SymbolId of the symbol with the given name.

source

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

Get the symbol with the given SymbolId.

source

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

Mutably get the symbol with the given SymbolId.

source

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

Add a new symbol and return its SymbolId.

source

pub fn has_uninitialized_tls(&self) -> bool

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

source

pub fn has_common(&self) -> bool

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

source

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.

source

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

Add a new file symbol and return its SymbolId.

source

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

Get the symbol for a section.

source

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.

source

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.

source

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.

source

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.

source

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

Add a relocation to a section.

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

source

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

Write the object to a Vec.

source

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

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.

source

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

Write the object to a WritableBuffer.

Trait Implementations§

source§

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

source§

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

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
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, 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.