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.
This commit is contained in:
Nobuyoshi Nakada 2023-10-14 16:51:11 +09:00
parent eb79b0319b
commit 96cd73d78f
No known key found for this signature in database
GPG Key ID: 3582D74E1FEE4465
3 changed files with 22 additions and 1 deletions

View File

@ -3952,6 +3952,22 @@ AC_CACHE_CHECK([for prefix of external symbols], rb_cv_symbol_prefix, [
]) ])
SYMBOL_PREFIX="$rb_cv_symbol_prefix" SYMBOL_PREFIX="$rb_cv_symbol_prefix"
test "x$SYMBOL_PREFIX" = xNONE && 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 DLNOBJ=dln.o
AC_ARG_ENABLE(dln, AC_ARG_ENABLE(dln,
AS_HELP_STRING([--disable-dln], [disable dynamic link feature]), AS_HELP_STRING([--disable-dln], [disable dynamic link feature]),

View File

@ -639,6 +639,7 @@ yes-test-leaked-globals: yes-test-leaked-globals-precheck
$(ACTIONS_GROUP) $(ACTIONS_GROUP)
$(Q) $(XRUBY) $(tooldir)/leaked-globals \ $(Q) $(XRUBY) $(tooldir)/leaked-globals \
SOEXT=$(SOEXT) NM="$(NM) -Pgp" SYMBOL_PREFIX=$(SYMBOL_PREFIX) \ SOEXT=$(SOEXT) NM="$(NM) -Pgp" SYMBOL_PREFIX=$(SYMBOL_PREFIX) \
SYMBOLS_IN_EMPTYLIB="@XSYMBOLS_IN_EMPTYLIB@" \
PLATFORM=$(hdrdir)/ruby/$(PLATFORM_DIR).h $(srcdir)/configure.ac \ PLATFORM=$(hdrdir)/ruby/$(PLATFORM_DIR).h $(srcdir)/configure.ac \
$(COMMONOBJS) $(LIBRUBY_FOR_LEAKED_GLOBALS:yes=$(LIBRUBY_SO)) $(COMMONOBJS) $(LIBRUBY_FOR_LEAKED_GLOBALS:yes=$(LIBRUBY_SO))
$(ACTIONS_ENDGROUP) $(ACTIONS_ENDGROUP)

View File

@ -11,11 +11,14 @@ until ARGV.empty?
platform = $1 platform = $1
when /\A SOEXT=(.+)?/x when /\A SOEXT=(.+)?/x
soext = $1 soext = $1
when /\A SYMBOLS_IN_EMPTYLIB=(.*)/x
SYMBOLS_IN_EMPTYLIB = $1.split(" ")
else else
break break
end end
ARGV.shift ARGV.shift
end end
SYMBOLS_IN_EMPTYLIB ||= nil
config = ARGV.shift config = ARGV.shift
count = 0 count = 0
@ -67,7 +70,6 @@ IO.foreach("|#{NM} #{ARGV.join(' ')}") do |line|
next unless n.sub!(/^#{SYMBOL_PREFIX}/o, "") next unless n.sub!(/^#{SYMBOL_PREFIX}/o, "")
next if n.include?(".") next if n.include?(".")
next if !so and n.start_with?("___asan_") next if !so and n.start_with?("___asan_")
case n; when "_init", "_fini"; next end
case n case n
when /\A(?:Init_|InitVM_|pm_|[Oo]nig|dln_|coroutine_)/ when /\A(?:Init_|InitVM_|pm_|[Oo]nig|dln_|coroutine_)/
next next
@ -75,6 +77,8 @@ IO.foreach("|#{NM} #{ARGV.join(' ')}") do |line|
next unless so next unless so
when /\A(?:RUBY_|ruby_|rb_)/ when /\A(?:RUBY_|ruby_|rb_)/
next unless so and /_(threadptr|ec)_/ =~ n next unless so and /_(threadptr|ec)_/ =~ n
when *SYMBOLS_IN_EMPTYLIB
next
end end
next if REPLACE.include?(n) next if REPLACE.include?(n)
puts col.fail("leaked") if count.zero? puts col.fail("leaked") if count.zero?