From 453f88f7f1c339a5256bc3a2c733610cc3ee965c Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Fri, 14 Mar 2025 16:24:31 +0900 Subject: [PATCH] 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. --- include/ruby/ruby.h | 8 ++++++++ internal/sanitizers.h | 12 ++++++++++++ main.c | 15 ++------------- ruby.c | 6 ++++++ 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