summaryrefslogtreecommitdiff
path: root/system/gcc/342-gccgo-more-unwinding.patch
diff options
context:
space:
mode:
authorA. Wilcox <AWilcox@Wilcox-Tech.com>2023-01-01 18:00:08 -0600
committerA. Wilcox <AWilcox@Wilcox-Tech.com>2023-01-02 23:15:26 -0600
commite16b285c8e8c54bed0ec0eba419c2959e7e22b07 (patch)
tree632ddb138790b5d19010444d9eecb55462fb2c42 /system/gcc/342-gccgo-more-unwinding.patch
parent775611f4880c202bc3fd1a693d9c1ad006456372 (diff)
downloadpackages-e16b285c8e8c54bed0ec0eba419c2959e7e22b07.tar.gz
packages-e16b285c8e8c54bed0ec0eba419c2959e7e22b07.tar.bz2
packages-e16b285c8e8c54bed0ec0eba419c2959e7e22b07.tar.xz
packages-e16b285c8e8c54bed0ec0eba419c2959e7e22b07.zip
system/gcc: Finish fixing unwinding in GCC Go rt
We add more functions to the unwind string comparisons, and pull in the symbols for libucontext. Fixes: 0dd86764 ("system/gcc: Ensure gccgo doesn't run off the stack") Refs: #832
Diffstat (limited to 'system/gcc/342-gccgo-more-unwinding.patch')
-rw-r--r--system/gcc/342-gccgo-more-unwinding.patch37
1 files changed, 37 insertions, 0 deletions
diff --git a/system/gcc/342-gccgo-more-unwinding.patch b/system/gcc/342-gccgo-more-unwinding.patch
new file mode 100644
index 000000000..7f059b4dc
--- /dev/null
+++ b/system/gcc/342-gccgo-more-unwinding.patch
@@ -0,0 +1,37 @@
+The fix for #832 was incomplete. Since we strip libgo.so, filename is
+always NULL. This caused the unwinder to continue through
+runtime_mstart which caused the same issue.
+--- gcc-8.5.0/libgo/runtime/go-callers.c.old 2023-01-01 17:56:27.302982459 -0600
++++ gcc-8.5.0/libgo/runtime/go-callers.c 2023-01-01 17:58:00.612903483 -0600
+@@ -118,27 +118,11 @@
+ if (function != NULL)
+ {
+ if (__builtin_strcmp (function, "makecontext") == 0
+- || __builtin_strcmp (function, "libucontext_makecontext") == 0)
++ || __builtin_strcmp (function, "libucontext_makecontext") == 0
++ || __builtin_strcmp (function, "runtime_mstart") == 0
++ || __builtin_strcmp (function, "runtime.kickoff") == 0
++ || __builtin_strcmp (function, "runtime.main") == 0)
+ return 1;
+- if (filename != NULL)
+- {
+- const char *p;
+-
+- p = strrchr (filename, '/');
+- if (p == NULL)
+- p = filename;
+- if (__builtin_strcmp (p, "/proc.c") == 0)
+- {
+- if (__builtin_strcmp (function, "runtime_mstart") == 0)
+- return 1;
+- }
+- else if (__builtin_strcmp (p, "/proc.go") == 0)
+- {
+- if (__builtin_strcmp (function, "runtime.kickoff") == 0
+- || __builtin_strcmp (function, "runtime.main") == 0)
+- return 1;
+- }
+- }
+ }
+
+ return arg->index >= arg->max;