about summary refs log tree commit diff
path: root/library/std/src
diff options
context:
space:
mode:
authorMohsen Zohrevandi <mohsen.zohrevandi@fortanix.com>2023-11-13 16:43:38 -0800
committerMohsen Zohrevandi <mohsen.zohrevandi@fortanix.com>2023-11-14 10:27:12 -0800
commit6e7ea03c268fea775b4b6b3edc49936272bd1d13 (patch)
treedb01d7b7260c2a2863aacaa0ca1abd218fdab207 /library/std/src
parent4bd2fd5c831a3ce74dc0ffd37b93af775d71ae70 (diff)
downloadrust-6e7ea03c268fea775b4b6b3edc49936272bd1d13.tar.gz
rust-6e7ea03c268fea775b4b6b3edc49936272bd1d13.zip
Adjust frame IP in backtraces relative to image base for SGX target
Diffstat (limited to 'library/std/src')
-rw-r--r--library/std/src/backtrace.rs5
-rw-r--r--library/std/src/sys_common/backtrace.rs5
2 files changed, 10 insertions, 0 deletions
diff --git a/library/std/src/backtrace.rs b/library/std/src/backtrace.rs
index e7110aebdea..c1874ffc5df 100644
--- a/library/std/src/backtrace.rs
+++ b/library/std/src/backtrace.rs
@@ -327,6 +327,11 @@ impl Backtrace {
         let _lock = lock();
         let mut frames = Vec::new();
         let mut actual_start = None;
+        #[cfg(all(target_vendor = "fortanix", target_env = "sgx"))]
+        {
+            let image_base = crate::os::fortanix_sgx::mem::image_base();
+            backtrace_rs::set_image_base(crate::ptr::from_exposed_addr_mut(image_base as _));
+        }
         unsafe {
             backtrace_rs::trace_unsynchronized(|frame| {
                 frames.push(BacktraceFrame {
diff --git a/library/std/src/sys_common/backtrace.rs b/library/std/src/sys_common/backtrace.rs
index 84e2c5d8d7f..e2acc6a2044 100644
--- a/library/std/src/sys_common/backtrace.rs
+++ b/library/std/src/sys_common/backtrace.rs
@@ -64,6 +64,11 @@ unsafe fn _print_fmt(fmt: &mut fmt::Formatter<'_>, print_fmt: PrintFmt) -> fmt::
     let mut first_omit = true;
     // Start immediately if we're not using a short backtrace.
     let mut start = print_fmt != PrintFmt::Short;
+    #[cfg(all(target_vendor = "fortanix", target_env = "sgx"))]
+    {
+        let image_base = crate::os::fortanix_sgx::mem::image_base();
+        backtrace_rs::set_image_base(crate::ptr::from_exposed_addr_mut(image_base as _));
+    }
     backtrace_rs::trace_unsynchronized(|frame| {
         if print_fmt == PrintFmt::Short && idx > MAX_NB_FRAMES {
             return false;