diff --git a/src/unwinder/find_fde/custom.rs b/src/unwinder/find_fde/custom.rs index cf9883d..25da562 100644 --- a/src/unwinder/find_fde/custom.rs +++ b/src/unwinder/find_fde/custom.rs @@ -22,7 +22,7 @@ pub unsafe trait EhFrameFinder { } pub struct FrameInfo { - pub text_base: usize, + pub text_base: Option, pub kind: FrameInfoKind, } @@ -102,13 +102,14 @@ fn find_fde(eh_frame_finder: &T, pc: usize) -> Option fn find_fde_with_eh_frame_hdr( pc: usize, - text_base: usize, + text_base: Option, eh_frame_hdr: usize, ) -> Option { unsafe { - let bases = BaseAddresses::default() - .set_text(text_base as _) - .set_eh_frame_hdr(eh_frame_hdr as _); + let mut bases = BaseAddresses::default().set_eh_frame_hdr(eh_frame_hdr as _); + if let Some(text_base) = text_base { + bases = bases.set_text(text_base as _); + } let eh_frame_hdr = EhFrameHdr::new( get_unlimited_slice(eh_frame_hdr as usize as _), NativeEndian, @@ -145,11 +146,16 @@ fn find_fde_with_eh_frame_hdr( } } -fn find_fde_with_eh_frame(pc: usize, text_base: usize, eh_frame: usize) -> Option { +fn find_fde_with_eh_frame( + pc: usize, + text_base: Option, + eh_frame: usize, +) -> Option { unsafe { - let bases = BaseAddresses::default() - .set_text(text_base as _) - .set_eh_frame(eh_frame as _); + let mut bases = BaseAddresses::default().set_eh_frame(eh_frame as _); + if let Some(text_base) = text_base { + bases = bases.set_text(text_base as _); + } let eh_frame = EhFrame::new(get_unlimited_slice(eh_frame as _), NativeEndian); if let Ok(fde) = eh_frame.fde_for_address(&bases, pc as _, EhFrame::cie_from_offset) {