summaryrefslogtreecommitdiff
diff options
authorNobuyoshi Nakada <[email protected]>2025-03-14 16:24:31 +0900
committerNobuyoshi Nakada <[email protected]>2025-03-16 17:33:58 +0900
commit453f88f7f1c339a5256bc3a2c733610cc3ee965c (patch)
treed0d83faa8be4886b72ca38695eff3d70c18b1304
parentf23146f09f3c5d0d9b72d044efa0a544566b4a49 (diff)
Make ASAN default option string built-in libruby
The content depends on ruby internal, not responsibility of the caller. Revive `RUBY_GLOBAL_SETUP` macro to define the hook function.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/12933
-rw-r--r--include/ruby/ruby.h8
-rw-r--r--internal/sanitizers.h12
-rw-r--r--main.c15
-rw-r--r--ruby.c6
4 files changed, 28 insertions, 13 deletions
diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h
index 035f02c70b..888ce89169 100644
--- a/include/ruby/ruby.h
+++ b/include/ruby/ruby.h
@@ -426,6 +426,14 @@ __extension__({ \
# include "ruby/backward.h"
#endif
+#ifndef RUBY__ASAN_DEFAULT_OPTIONS
+# define RUBY__ASAN_DEFAULT_OPTIONS
+#endif
+
+#define RUBY_GLOBAL_SETUP \
+ RUBY__ASAN_DEFAULT_OPTIONS \
+ /* RUBY_GLOBAL_SETUP end */
+
RBIMPL_SYMBOL_EXPORT_END()
#endif /* RUBY_RUBY_H */
diff --git a/internal/sanitizers.h b/internal/sanitizers.h
index 6a9f80bcc9..279cbbe069 100644
--- a/internal/sanitizers.h
+++ b/internal/sanitizers.h
@@ -314,5 +314,17 @@ asan_get_fake_stack_extents(void *thread_fake_stack_handle, VALUE slot,
return false;
}
+extern const char ruby_asan_default_options[];
+
+#ifdef RUBY_ASAN_ENABLED
+/* Compile in the ASAN options Ruby needs, rather than relying on environment variables, so
+ * that even tests which fork ruby with a clean environment will run ASAN with the right
+ * settings */
+# undef RUBY__ASAN_DEFAULT_OPTIONS
+# define RUBY__ASAN_DEFAULT_OPTIONS \
+ RBIMPL_SYMBOL_EXPORT_BEGIN() \
+ const char * __asan_default_options(void) {return ruby_asan_default_options;} \
+ RBIMPL_SYMBOL_EXPORT_END()
+#endif
#endif /* INTERNAL_SANITIZERS_H */
diff --git a/main.c b/main.c
index 01346eeb2e..35efcde175 100644
--- a/main.c
+++ b/main.c
@@ -32,6 +32,8 @@
# undef RUBY_DEBUG_ENV
#endif
+RUBY_GLOBAL_SETUP
+
static int
rb_main(int argc, char **argv)
{
@@ -64,16 +66,3 @@ main(int argc, char **argv)
ruby_sysinit(&argc, &argv);
return rb_main(argc, argv);
}
-
-#ifdef RUBY_ASAN_ENABLED
-/* Compile in the ASAN options Ruby needs, rather than relying on environment variables, so
- * that even tests which fork ruby with a clean environment will run ASAN with the right
- * settings */
-RUBY_SYMBOL_EXPORT_BEGIN
-const char *
-__asan_default_options(void)
-{
- return "use_sigaltstack=0:detect_leaks=0";
-}
-RUBY_SYMBOL_EXPORT_END
-#endif
diff --git a/ruby.c b/ruby.c
index db60a67ecd..4dbd5909c8 100644
--- a/ruby.c
+++ b/ruby.c
@@ -3188,3 +3188,9 @@ ruby_sysinit(int *argc, char ***argv)
}
fill_standard_fds();
}
+
+#ifdef RUBY_ASAN_ENABLED
+RUBY_SYMBOL_EXPORT_BEGIN
+const char ruby_asan_default_options[] = "use_sigaltstack=0:detect_leaks=0";
+RUBY_SYMBOL_EXPORT_END
+#endif