Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Accessing .so libraries using dlopen() throws undefined symbol error

I'm trying to dynamically load a camera library .so file into a Linux executable to gain access to simple camera functions.

I'm attempting to do this by:

  if ( (newHandle = dlopen("./libCamera.so",RTLD_LAZY | RTLD_GLOBAL)) == NULL )
  {
     printf( "Could not open file : %s\n", dlerror() );   
     return 1;
  }

However this fails and I receive the following output: "Could not open file : libCamera.so: undefined symbol: ZTVN10_cxxabiv117__class_type_infoE"

How do I find out what symbols it is relying on?

like image 566
Joey Big Avatar asked Jan 31 '13 10:01

Joey Big


1 Answers

Most likely, libCamera.so uses a symbol defined in a shared library without depending on that library.

  1. Find a culprit. Take a real executable which links against libCamera.so (and it works). List its dependencies with ldd /path/to/executable. Among them should be a library which has a definition for ZTVN10_cxxabiv117__class_type_infoE (use grep to select likely candidates, nm -D on a library to be sure). That library won't be in the list shown by ldd ./libCamera.so.

  2. Solve a problem. Load the library found in step 1 by dlopen first (use RTLD_GLOBAL there as well).

  3. If there is a problem with another symbol, goto step 1.

  4. If newly-added libraries have the same problem too, goto step 1.

  5. Tell library authors to please fix their linking.

It could also happen that one of the prerequisites in ldd ./libCamera.so got upgraded and lost a symbol definition (maybe it was recompiled with a compiler which does name mangling differently). Then you won't find the culprit in step 1, and there is no solution but downgrading something again.

like image 187
Anton Kovalenko Avatar answered Oct 24 '22 00:10

Anton Kovalenko