Parcourir la source

find_fde: make `text_base` optional

No platforms currently use relative addressing. Make this parameter
optional in order to support targets where this value is not available.

Signed-off-by: Sean Cross <sean@xobs.io>
Sean Cross il y a 1 an
Parent
commit
2f9e374431
1 fichiers modifiés avec 15 ajouts et 9 suppressions
  1. 15 9
      src/unwinder/find_fde/custom.rs

+ 15 - 9
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<usize>,
     pub kind: FrameInfoKind,
 }
 
@@ -102,13 +102,14 @@ fn find_fde<T: EhFrameFinder + ?Sized>(eh_frame_finder: &T, pc: usize) -> Option
 
 fn find_fde_with_eh_frame_hdr(
     pc: usize,
-    text_base: usize,
+    text_base: Option<usize>,
     eh_frame_hdr: usize,
 ) -> Option<FDESearchResult> {
     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<FDESearchResult> {
+fn find_fde_with_eh_frame(
+    pc: usize,
+    text_base: Option<usize>,
+    eh_frame: usize,
+) -> Option<FDESearchResult> {
     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) {