From 331a4ab5bcd0915f11f6f01d0b9e6f9c221f3789 Mon Sep 17 00:00:00 2001 From: Spring_MT Date: Sun, 6 Jul 2025 13:48:48 +0900 Subject: [PATCH] Fix symbol collision with other native gems using libzstd - Hide all ZSTD symbols by default using -fvisibility=hidden - Use exported_symbols_list on macOS to explicitly control exported symbols - Only export Init_zstdruby function required for Ruby extension initialization - Add RUBY_FUNC_EXPORTED macro to Init_zstdruby function This resolves symbol collision issues when using zstd-ruby alongside other gems that dynamically link to system libzstd (e.g., rdkafka-ruby). Fixes #102 --- ext/zstdruby/exports.txt | 1 + ext/zstdruby/extconf.rb | 7 ++++++- ext/zstdruby/main.c | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 ext/zstdruby/exports.txt diff --git a/ext/zstdruby/exports.txt b/ext/zstdruby/exports.txt new file mode 100644 index 0000000..f1607c0 --- /dev/null +++ b/ext/zstdruby/exports.txt @@ -0,0 +1 @@ +_Init_zstdruby \ No newline at end of file diff --git a/ext/zstdruby/extconf.rb b/ext/zstdruby/extconf.rb index f153b7e..4ed2b2d 100644 --- a/ext/zstdruby/extconf.rb +++ b/ext/zstdruby/extconf.rb @@ -2,9 +2,14 @@ have_func('rb_gc_mark_movable') -$CFLAGS = '-I. -O3 -std=c99 -DZSTD_STATIC_LINKING_ONLY -DZSTD_MULTITHREAD -pthread -DDEBUGLEVEL=0' +$CFLAGS = '-I. -O3 -std=c99 -DZSTD_STATIC_LINKING_ONLY -DZSTD_MULTITHREAD -pthread -DDEBUGLEVEL=0 -fvisibility=hidden -DZSTDLIB_VISIBLE=\'__attribute__((visibility("hidden")))\' -DZSTDLIB_HIDDEN=\'__attribute__((visibility("hidden")))\'' $CPPFLAGS += " -fdeclspec" if CONFIG['CXX'] =~ /clang/ +# macOS specific: Use exported_symbols_list to control symbol visibility +if RUBY_PLATFORM =~ /darwin/ + $LDFLAGS += " -exported_symbols_list #{File.expand_path('exports.txt', __dir__)}" +end + Dir.chdir File.expand_path('..', __FILE__) do $srcs = Dir['**/*.c', '**/*.S'] diff --git a/ext/zstdruby/main.c b/ext/zstdruby/main.c index e859fa0..5497b0e 100644 --- a/ext/zstdruby/main.c +++ b/ext/zstdruby/main.c @@ -8,7 +8,7 @@ void zstd_ruby_skippable_frame_init(void); void zstd_ruby_streaming_compress_init(void); void zstd_ruby_streaming_decompress_init(void); -void +RUBY_FUNC_EXPORTED void Init_zstdruby(void) { #ifdef HAVE_RB_EXT_RACTOR_SAFE