diff --git a/Cargo.toml b/Cargo.toml index d84a5bc..f0ec722 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,8 @@ members = ["cdylib", "example"] gimli = { version = "0.26.1", default-features = false, features = ["read-core"] } libc = { version = "0.2", optional = true } spin = { version = "0.9.8", optional = true, default-features = false, features = ["mutex", "spin_mutex"] } +core = { version = '1.0.0', optional = true, package = 'rustc-std-workspace-core' } +compiler_builtins = { version = "0.1.2", optional = true } [features] alloc = [] @@ -36,6 +38,7 @@ panic-handler = ["print", "panic"] panic-handler-dummy = [] system-alloc = [] default = ["unwinder", "dwarf-expr", "hide-trace", "fde-phdr-dl", "fde-registry"] +rustc-dep-of-std = ["core", "gimli/rustc-dep-of-std", "compiler_builtins"] [profile.release] debug = true 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) {