Re: libgomp and python: dlopen fails

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Sebastian Steiger writes:
 > The interesting part of the output when LD_DEBUG=all is this:
 > 
 >      21475:     file=libgomp.so.1 [0];  generating link map
 >       21475:     symbol=dlerror;  lookup in file=python
 >       21475:     symbol=dlerror;  lookup in 
 > file=/usr/lib64/libpython2.3.so.1.0
 >       21475:     symbol=dlerror;  lookup in file=/lib64/tls/libpthread.so.0
 >       21475:     symbol=dlerror;  lookup in file=/lib64/libdl.so.2
 >       21475:     binding file /usr/lib64/libpython2.3.so.1.0 to 
 > /lib64/libdl.so.2: normal symbol `dlerror' [GLIBC_2.2.5]
 >       21475:     symbol=__dcgettext;  lookup in file=python
 >       21475:     symbol=__dcgettext;  lookup in 
 > file=/usr/lib64/libpython2.3.so.1.0
 >       21475:     symbol=__dcgettext;  lookup in 
 > file=/lib64/tls/libpthread.so.0
 >       21475:     symbol=__dcgettext;  lookup in file=/lib64/libdl.so.2
 >       21475:     symbol=__dcgettext;  lookup in file=/lib64/libutil.so.1
 >       21475:     symbol=__dcgettext;  lookup in file=/lib64/tls/libm.so.6
 >       21475:     symbol=__dcgettext;  lookup in file=/lib64/tls/libc.so.6
 >       21475:     binding file /lib64/libdl.so.2 to /lib64/tls/libc.so.6: 
 > normal symbol `__dcgettext' [GLIBC_2.2.5]
 >       21475:     symbol=__asprintf;  lookup in file=python
 >       21475:     symbol=__asprintf;  lookup in 
 > file=/usr/lib64/libpython2.3.so.1.0
 >       21475:     symbol=__asprintf;  lookup in 
 > file=/lib64/tls/libpthread.so.0
 >       21475:     symbol=__asprintf;  lookup in file=/lib64/libdl.so.2
 > 
 > < The rest is just python stuff for error handling and screen output.>
 > 
 > 
 > 
 > This encouraged me to take a sample C++ file for testing dlopen() which 
 > I found on the internet:
 > 
 > 
 > #include <iostream>
 > #include <dlfcn.h>
 > using namespace std;
 > 
 > int main()
 > {	
 >      void* handle = dlopen("(...)/libgomp.so.1", RTLD_LAZY);
 > 
 >      if (!handle) {
 >          cerr << "Cannot open library: " << dlerror() << '\n';
 >          return 1;
 >      }
 >      cout << "Loading was successful. Closing library...\n";
 >      dlclose(handle);
 > }
 > 
 > 
 > 
 > I compiled this file with g++4 -o dlopen_test.bin dlopen_test.cpp -ldl 
 > (I called the file dlopen_test.cpp) and got the following output:
 > 
 > "Cannot open library: (...)/libgomp.so.1: shared object cannot be 
 > dlopen()ed"
 > 
 > 
 > Obviously the output of the python shell was just dlerror(), but it is 
 > not very instructive.
 > 
 > I also tried RTLD_NOW instead of RTLD_LAZY, but the error was the same.

This message comes from the dynamic linker:

  /* Make sure we are not dlopen'ing an object
     that has the DF_1_NOOPEN flag set.  */
  if (__builtin_expect (l->l_flags_1 & DF_1_NOOPEN, 0)
      && (mode & __RTLD_DLOPEN))
    {
      /* We are not supposed to load this object.  Free all resources.  */
      __munmap ((void *) l->l_map_start, l->l_map_end - l->l_map_start);
...
      errstring = N_("shared object cannot be dlopen()ed");
      goto call_lose;
    }

Because when you (or someone else) built libgomp.so.1, the object
was marked with the NOOPEN flag. From "info ld":

  -z nodlopen
          Marks the object not available to `dlopen'.


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux