Bug #9928
closedFiddle::TestHandle#test_NEXT fails on AIX due to unexported symbols of extension libraries
Description
Fiddle::TestHandle#test_NEXT
fails on AIX.
[ 4/21] Fiddle::TestHandle#test_NEXT = 0.00 s
1) Error:
Fiddle::TestHandle#test_NEXT:
Fiddle::DLError: unknown symbol "Init_objspace"
/ss/home/rayod/Dev/Contribution/ruby-trunk-blue1/test/fiddle/test_handle.rb:171:in `[]'
/ss/home/rayod/Dev/Contribution/ruby-trunk-blue1/test/fiddle/test_handle.rb:171:in `rescue in test_NEXT'
/ss/home/rayod/Dev/Contribution/ruby-trunk-blue1/test/fiddle/test_handle.rb:144:in `test_NEXT'
The reason for this is a little bit complicated. Fiddle::TestHandle#test_NEXT
tests the behavior of RTLD_NEXT
for dlsym(3)
. According to the manual, RTLD_NEXT
of AIX should behave like that of BSD, so the following part in Fiddle::TestHandle#test_NEXT
should succeed, but in fact it fails.
# BSD
#
<snip>
require 'objspace'
handle = Handle::NEXT
refute_nil handle['Init_objspace']
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). The build process on AIX only specifies Init_*
functions as the entry points of the extension shared libraries. This means Init_objspace
cannot be the search target of RTLD_NEXT
, and the test above results in nil. (FYI, the symbols in the modules loaded by load(3) can be found by RTLD_NEXT
if they are exported.)
One way to solve this is to somehow export the Init_objspace
function. However, specifying -Wl,-bexpall does not export the entry points, so we need to specify -Wl,-bexpfull, which looks like overkill for just passing this test.
Fortunately, on AIX, test/fiddle/helper.rb creates and loads a dummy shared library, libaixdltest.so, which contains and exports strcpy
and some other functions, so we can take advantage of it for testing RTLD_NEXT
. That is, we can simply query strcpy
to check whether or not RTLD_NEXT
works correctly, as follows. The patch is attached.
handle = Handle::NEXT
refute_nil handle['strcpy']
Files