aboutsummaryrefslogtreecommitdiffstats
path: root/addr2line.c
diff options
context:
space:
mode:
authorYusuke Endoh <mame@ruby-lang.org>2022-12-19 17:15:31 +0900
committerYusuke Endoh <mame@ruby-lang.org>2022-12-23 23:48:18 +0900
commit65920cfc40b47e9e037e0536b2b7de8f0cf30fc3 (patch)
treec7aea8cb8fd376ddbe001d2cf7c353a582e511c4 /addr2line.c
parent97280faf2818cc464e1ef9e898807c60a2726bf8 (diff)
downloadruby-65920cfc40b47e9e037e0536b2b7de8f0cf30fc3.tar.gz
addr2line.c: Strip pointer authentication
We need to manually strip pointer authentication bits on M1 mac because libunwind leaks them out. Co-Authored-By: NARUSE, Yui <naruse@airemix.jp> Co-Authored-By: Yuta Saito <kateinoigakukun@gmail.com>
Diffstat (limited to 'addr2line.c')
-rw-r--r--addr2line.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/addr2line.c b/addr2line.c
index 00f542261e..77538f6eb9 100644
--- a/addr2line.c
+++ b/addr2line.c
@@ -2548,6 +2548,16 @@ rb_dump_backtrace_with_lines(int num_traces, void **traces)
obj_info_t *obj = NULL;
/* 2 is NULL + main executable */
void **dladdr_fbases = (void **)calloc(num_traces+2, sizeof(void *));
+
+#if defined(__APPLE__) && defined(__aarch64__)
+ // Strip Arm64's pointer authentication.
+ for (i = 0; i < num_traces; i++) {
+ // I wish I could use "ptrauth_strip()" but I get an error:
+ // "this target does not support pointer authentication"
+ traces[i] = (void*)(((uint64_t)traces[i]) & 0x7fffffffffffull);
+ }
+#endif
+
#ifdef HAVE_MAIN_EXE_PATH
char *main_path = NULL; /* used on printing backtrace */
ssize_t len;