diff options
author | Nobuyoshi Nakada <[email protected]> | 2023-10-14 16:51:11 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <[email protected]> | 2023-10-14 18:38:24 +0900 |
commit | 96cd73d78f8986db0aaab9368c2ffa6867613a37 (patch) | |
tree | d30652b2bbafc6b2fb3dc63db1f5b4d8a7ec6ab0 | |
parent | eb79b0319bc9b04067bd9c795f9447dd03615df2 (diff) |
Ignore symbols even in empty shared library
On some platforms, such as FreeBSD and Oracle Linux, symbols defined
in the crt0 setup routine are exported from shared libraries. So
ignore the symbols that would be exported even in an empty shared
library.
-rw-r--r-- | configure.ac | 16 | ||||
-rw-r--r-- | template/Makefile.in | 1 | ||||
-rwxr-xr-x | tool/leaked-globals | 6 |
3 files changed, 22 insertions, 1 deletions
diff --git a/configure.ac b/configure.ac index 3e2fe43e04..71f831636c 100644 --- a/configure.ac +++ b/configure.ac @@ -3952,6 +3952,22 @@ AC_CACHE_CHECK([for prefix of external symbols], rb_cv_symbol_prefix, [ ]) SYMBOL_PREFIX="$rb_cv_symbol_prefix" test "x$SYMBOL_PREFIX" = xNONE && SYMBOL_PREFIX='' + +AS_IF([test x"$enable_shared" = xyes], [ + AC_CACHE_CHECK([for default symbols in empty shared library], rb_cv_symbols_in_emptylib, [ + save_CC="$CC" + eval CC=\"`printf "%s" "${DLDSHARED}" | sed ['s/\$(CC)/${CC}/']`\" + AC_LINK_IFELSE([AC_LANG_PROGRAM()],[ + rb_cv_symbols_in_emptylib=`$NM -Pgp conftest$ac_exeext | + sed ["/ [A-TV-Z] .*/!d;s///;s/^${SYMBOL_PREFIX}//;/^main$/d"]` + ]) + set ${rb_cv_symbols_in_emptylib} + rb_cv_symbols_in_emptylib="$*" + CC="$save_CC" + ]) +]) +AC_SUBST(XSYMBOLS_IN_EMPTYLIB, "${rb_cv_symbols_in_emptylib}") + DLNOBJ=dln.o AC_ARG_ENABLE(dln, AS_HELP_STRING([--disable-dln], [disable dynamic link feature]), diff --git a/template/Makefile.in b/template/Makefile.in index a3b512b3a8..85a907dcd5 100644 --- a/template/Makefile.in +++ b/template/Makefile.in @@ -639,6 +639,7 @@ yes-test-leaked-globals: yes-test-leaked-globals-precheck $(ACTIONS_GROUP) $(Q) $(XRUBY) $(tooldir)/leaked-globals \ SOEXT=$(SOEXT) NM="$(NM) -Pgp" SYMBOL_PREFIX=$(SYMBOL_PREFIX) \ + SYMBOLS_IN_EMPTYLIB="@XSYMBOLS_IN_EMPTYLIB@" \ PLATFORM=$(hdrdir)/ruby/$(PLATFORM_DIR).h $(srcdir)/configure.ac \ $(COMMONOBJS) $(LIBRUBY_FOR_LEAKED_GLOBALS:yes=$(LIBRUBY_SO)) $(ACTIONS_ENDGROUP) diff --git a/tool/leaked-globals b/tool/leaked-globals index 367d35ab86..87089ebd81 100755 --- a/tool/leaked-globals +++ b/tool/leaked-globals @@ -11,11 +11,14 @@ until ARGV.empty? platform = $1 when /\A SOEXT=(.+)?/x soext = $1 + when /\A SYMBOLS_IN_EMPTYLIB=(.*)/x + SYMBOLS_IN_EMPTYLIB = $1.split(" ") else break end ARGV.shift end +SYMBOLS_IN_EMPTYLIB ||= nil config = ARGV.shift count = 0 @@ -67,7 +70,6 @@ IO.foreach("|#{NM} #{ARGV.join(' ')}") do |line| next unless n.sub!(/^#{SYMBOL_PREFIX}/o, "") next if n.include?(".") next if !so and n.start_with?("___asan_") - case n; when "_init", "_fini"; next end case n when /\A(?:Init_|InitVM_|pm_|[Oo]nig|dln_|coroutine_)/ next @@ -75,6 +77,8 @@ IO.foreach("|#{NM} #{ARGV.join(' ')}") do |line| next unless so when /\A(?:RUBY_|ruby_|rb_)/ next unless so and /_(threadptr|ec)_/ =~ n + when *SYMBOLS_IN_EMPTYLIB + next end next if REPLACE.include?(n) puts col.fail("leaked") if count.zero? |