Bug #9928 ยป test_NEXT_for_aix.patch
| test/fiddle/test_handle.rb (working copy) | ||
|---|---|---|
|
handle = Handle::NEXT
|
||
|
refute_nil handle['malloc']
|
||
|
rescue
|
||
|
# BSD
|
||
|
#
|
||
|
# If dlsym() is called with the special handle RTLD_NEXT, then the search
|
||
|
# for the symbol is limited to the shared objects which were loaded after
|
||
|
# the one issuing the call to dlsym(). Thus, if the function is called
|
||
|
# from the main program, all the shared libraries are searched. If it is
|
||
|
# called from a shared library, all subsequent shared libraries are
|
||
|
# searched. RTLD_NEXT is useful for implementing wrappers around library
|
||
|
# functions. For example, a wrapper function getpid() could access the
|
||
|
# "real" getpid() with dlsym(RTLD_NEXT, "getpid"). (Actually, the dlfunc()
|
||
|
# interface, below, should be used, since getpid() is a function and not a
|
||
|
# data object.)
|
||
|
# --- FreeBSD 8.0 dlsym(3)
|
||
|
require 'objspace'
|
||
|
handle = Handle::NEXT
|
||
|
refute_nil handle['Init_objspace']
|
||
|
begin
|
||
|
# BSD
|
||
|
#
|
||
|
# If dlsym() is called with the special handle RTLD_NEXT, then the search
|
||
|
# for the symbol is limited to the shared objects which were loaded after
|
||
|
# the one issuing the call to dlsym(). Thus, if the function is called
|
||
|
# from the main program, all the shared libraries are searched. If it is
|
||
|
# called from a shared library, all subsequent shared libraries are
|
||
|
# searched. RTLD_NEXT is useful for implementing wrappers around library
|
||
|
# functions. For example, a wrapper function getpid() could access the
|
||
|
# "real" getpid() with dlsym(RTLD_NEXT, "getpid"). (Actually, the dlfunc()
|
||
|
# interface, below, should be used, since getpid() is a function and not a
|
||
|
# data object.)
|
||
|
# --- FreeBSD 8.0 dlsym(3)
|
||
|
require 'objspace'
|
||
|
handle = Handle::NEXT
|
||
|
refute_nil handle['Init_objspace']
|
||
|
rescue
|
||
|
# AIX
|
||
|
#
|
||
|
# The behavior of AIX for RTLD_NEXT is the same as that of BSD.
|
||
|
# However, the problem is that on AIX, Ruby's extension libraries do not
|
||
|
# export their symbols, because they are loaded not by dlopen(3)/dlsym(3)
|
||
|
# but by load(3) (See dln.c). This means 'Init_objspace' is not the search
|
||
|
# target of RTLD_NEXT and the test above results in nil.
|
||
|
# Fortunately, on AIX, helper.rb creates and loads a dummy shared library,
|
||
|
# libaixdltest.so, which contains 'strcpy' and some other functions,
|
||
|
# so we can take advantage of it for testing RTLD_NEXT.
|
||
|
handle = Handle::NEXT
|
||
|
refute_nil handle['strcpy']
|
||
|
end
|
||
|
end
|
||
|
end unless /mswin|mingw/ =~ RUBY_PLATFORM
|
||