Issue #9928 has been updated by Nobuyoshi Nakada.


Export files are used on Windows already, so it would not be a trouble.

----------------------------------------
Bug #9928: Fiddle::TestHandle#test_NEXT fails on AIX due to unexported symbols of extension libraries
https://bugs.ruby-lang.org/issues/9928#change-47178

* Author: Rei Odaira
* Status: Open
* Priority: Normal
* Assignee: Yutaka Kanemoto
* Category: platform/aix
* Target version: 
* ruby -v: ruby 2.2.0dev (2014-06-02 trunk 45270) [powerpc-aix7.1.0.0]
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN
----------------------------------------
`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--------------------------------
test_NEXT_for_aix.patch (2.96 KB)


-- 
https://bugs.ruby-lang.org/