/// Trait for relocating addresses and offsets while reading a section. pubtrait Relocate<T: ReaderOffset = usize> { /// Relocate an address which was read from the given section offset. fn relocate_address(&self, offset: T, value: u64) -> Result<u64>;
/// Relocate a value which was read from the given section offset. fn relocate_offset(&self, offset: T, value: T) -> Result<T>;
}
/// A `Reader` which applies relocations to addresses and offsets. /// /// This is useful for reading sections which contain relocations, /// such as those in a relocatable object file. /// It is generally not used for reading sections in an executable file. #[derive(Debug, Clone)] pubstruct RelocateReader<R: Reader<Offset = usize>, T: Relocate<R::Offset>> {
section: R,
reader: R,
relocate: T,
}
impl<R, T> RelocateReader<R, T> where
R: Reader<Offset = usize>,
T: Relocate<R::Offset>,
{ /// Create a new `RelocateReader` which applies relocations to the given section reader. pubfn new(section: R, relocate: T) -> Self { let reader = section.clone(); Self {
section,
reader,
relocate,
}
}
}
impl<R, T> Reader for RelocateReader<R, T> where
R: Reader<Offset = usize>,
T: Relocate<R::Offset> + Debug + Clone,
{ type Endian = R::Endian; type Offset = R::Offset;
fn read_address(&mutself, address_size: u8) -> Result<u64> { let offset = self.reader.offset_from(&self.section); let value = self.reader.read_address(address_size)?; self.relocate.relocate_address(offset, value)
}
fn read_offset(&mutself, format: Format) -> Result<R::Offset> { let offset = self.reader.offset_from(&self.section); let value = self.reader.read_offset(format)?; self.relocate.relocate_offset(offset, value)
}
fn read_sized_offset(&mutself, size: u8) -> Result<R::Offset> { let offset = self.reader.offset_from(&self.section); let value = self.reader.read_sized_offset(size)?; self.relocate.relocate_offset(offset, value)
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.