forked from M-Labs/nac3
copy constructor -> clone
This commit is contained in:
parent
71dec251e3
commit
015714eee1
|
@ -24,6 +24,7 @@ pub const DW_EH_PE_aligned: u8 = 0x50;
|
||||||
|
|
||||||
pub const DW_EH_PE_indirect: u8 = 0x80;
|
pub const DW_EH_PE_indirect: u8 = 0x80;
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
pub struct DwarfReader<'a> {
|
pub struct DwarfReader<'a> {
|
||||||
pub slice: &'a [u8],
|
pub slice: &'a [u8],
|
||||||
pub virt_addr: u32,
|
pub virt_addr: u32,
|
||||||
|
@ -34,11 +35,6 @@ impl<'a> DwarfReader<'a> {
|
||||||
DwarfReader { slice, virt_addr }
|
DwarfReader { slice, virt_addr }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates a new instance from another instance of [DwarfReader].
|
|
||||||
pub fn from_reader(other: &DwarfReader<'a>) -> DwarfReader<'a> {
|
|
||||||
DwarfReader::new(other.slice, other.virt_addr)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn offset(&mut self, offset: u32) {
|
pub fn offset(&mut self, offset: u32) {
|
||||||
self.slice = &self.slice[offset as usize..];
|
self.slice = &self.slice[offset as usize..];
|
||||||
self.virt_addr = self.virt_addr.wrapping_add(offset);
|
self.virt_addr = self.virt_addr.wrapping_add(offset);
|
||||||
|
@ -221,7 +217,7 @@ impl<'a> EH_Frame<'a> {
|
||||||
|
|
||||||
/// Returns an [Iterator] over all Call Frame Information (CFI) records.
|
/// Returns an [Iterator] over all Call Frame Information (CFI) records.
|
||||||
pub fn cfi_records(&self) -> CFI_Records<'a> {
|
pub fn cfi_records(&self) -> CFI_Records<'a> {
|
||||||
let reader = DwarfReader::from_reader(&self.reader);
|
let reader = self.reader.clone();
|
||||||
let len = reader.slice.len();
|
let len = reader.slice.len();
|
||||||
|
|
||||||
CFI_Records { reader, available: len }
|
CFI_Records { reader, available: len }
|
||||||
|
@ -252,7 +248,7 @@ impl<'a> CFI_Record<'a> {
|
||||||
0xFFFF_FFFF => unimplemented!(),
|
0xFFFF_FFFF => unimplemented!(),
|
||||||
|
|
||||||
_ => {
|
_ => {
|
||||||
let mut fde_reader = DwarfReader::from_reader(cie_reader);
|
let mut fde_reader = cie_reader.clone();
|
||||||
fde_reader.offset(length);
|
fde_reader.offset(length);
|
||||||
fde_reader
|
fde_reader
|
||||||
}
|
}
|
||||||
|
@ -271,7 +267,7 @@ impl<'a> CFI_Record<'a> {
|
||||||
// Skip code/data alignment factors & return address register along the way as well
|
// Skip code/data alignment factors & return address register along the way as well
|
||||||
// We only tackle the case where 'z' and 'R' are part of the augmentation string, otherwise
|
// We only tackle the case where 'z' and 'R' are part of the augmentation string, otherwise
|
||||||
// we cannot get the addresses to make .eh_frame_hdr
|
// we cannot get the addresses to make .eh_frame_hdr
|
||||||
let mut aug_data_reader = DwarfReader::from_reader(cie_reader);
|
let mut aug_data_reader = cie_reader.clone();
|
||||||
let mut aug_str_len = 0;
|
let mut aug_str_len = 0;
|
||||||
loop {
|
loop {
|
||||||
if aug_data_reader.read_u8() == b'\0' {
|
if aug_data_reader.read_u8() == b'\0' {
|
||||||
|
@ -314,7 +310,7 @@ impl<'a> CFI_Record<'a> {
|
||||||
/// Returns a [DwarfReader] initialized to the first Frame Description Entry (FDE) of this CFI
|
/// Returns a [DwarfReader] initialized to the first Frame Description Entry (FDE) of this CFI
|
||||||
/// record.
|
/// record.
|
||||||
pub fn get_fde_reader(&self) -> DwarfReader<'a> {
|
pub fn get_fde_reader(&self) -> DwarfReader<'a> {
|
||||||
DwarfReader::from_reader(&self.fde_reader)
|
self.fde_reader.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns an [Iterator] over all Frame Description Entries (FDEs).
|
/// Returns an [Iterator] over all Frame Description Entries (FDEs).
|
||||||
|
@ -342,7 +338,7 @@ impl<'a> Iterator for CFI_Records<'a> {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut this_reader = DwarfReader::from_reader(&self.reader);
|
let mut this_reader = self.reader.clone();
|
||||||
|
|
||||||
// Remove the length of the header and the content from the counter
|
// Remove the length of the header and the content from the counter
|
||||||
let length = self.reader.read_u32();
|
let length = self.reader.read_u32();
|
||||||
|
@ -355,7 +351,7 @@ impl<'a> Iterator for CFI_Records<'a> {
|
||||||
|
|
||||||
// Remove the length of the header and the content from the counter
|
// Remove the length of the header and the content from the counter
|
||||||
self.available -= length + mem::size_of::<u32>();
|
self.available -= length + mem::size_of::<u32>();
|
||||||
let mut next_reader = DwarfReader::from_reader(&self.reader);
|
let mut next_reader = self.reader.clone();
|
||||||
next_reader.offset(length as u32);
|
next_reader.offset(length as u32);
|
||||||
|
|
||||||
let cie_ptr = self.reader.read_u32();
|
let cie_ptr = self.reader.read_u32();
|
||||||
|
@ -403,7 +399,7 @@ impl<'a> Iterator for FDE_Records<'a> {
|
||||||
|
|
||||||
// Remove the length of the header and the content from the counter
|
// Remove the length of the header and the content from the counter
|
||||||
self.available -= length + mem::size_of::<u32>();
|
self.available -= length + mem::size_of::<u32>();
|
||||||
let mut next_fde_reader = DwarfReader::from_reader(&self.reader);
|
let mut next_fde_reader = self.reader.clone();
|
||||||
next_fde_reader.offset(length as u32);
|
next_fde_reader.offset(length as u32);
|
||||||
|
|
||||||
let cie_ptr = self.reader.read_u32();
|
let cie_ptr = self.reader.read_u32();
|
||||||
|
|
Loading…
Reference in New Issue