Search code examples
clinuxc++11boost

Including a Boost C++ header causes dlopen() to return error: _ZTVN10__cxxabiv117__class_type_infoE


The C HelloWorld.so (shared object) is created by linking in a C++ myatomic library. That C++ library uses a Boost Header:

myatomic.cpp

...
#include <boost/system/error_code.hpp>
...

Loading HelloWorld.so with dlopen() returns error: _ZTVN10__cxxabiv117__class_type_infoE

If that Boost header is commented-out, then dlopen() succeeds?

HelloWorld.yaml

...    
Common:
  Sources:
    - Folder: src
      Files:
        - HelloWorld.h
        - HelloWorld.c
  ConanLibs:
     - CONAN_PKG::myatomic
Linux:
  CompilerOptions:
    - -fPIC
  LinkerOptions:
    - -lstdc++
  

Does Boost C++ under linux need to built with specific options? Maybe gcc vs g++ issues?
Added -lstdc++ to HelloWorld linker options but to no avail. :(


Solution

  • A co-worker discovered this fix

    If we're interacting with C++ materials (in this case Boost C++), we need to be using g++. The gcc tool, even if supplied with a bunch of -lstdc++ args - does not fill the shoes of the g++ compiler, in terms of things like 'linker/loader hints'

    The reason for the error _ZTVN10__cxxabiv117__class_type_infoE is the HelloWorld.so (C program) was not loading a runtime dependent (C++ shared object) libstdc++.so.6. For example,

    $ ldd HelloWorldBAD.so

    linux-vdso.so.1 (0x00007ffc8a5c5000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f78cf21f000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f78cf431000)
    

    $ ldd HelloWorldGOOD.so

    linux-vdso.so.1 (0x00007ffd53bba000)
    libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f2540003000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f253fe11000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f253fcc2000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f2540205000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f253fca7000)
    

    Edit

    It was also found that the ordering of the -lstdc++ option is important. (see also this link) This command correctly includes the C++ runtime dependencies by placing the -lstdc++ option at the END of the build command

    /usr/bin/cc -fPIC -O2 -g -DNDEBUG -shared -Wl,-soname,HelloWorld.so ...Lots of Boost Libraries... -lstdc++
    

    whereas putting the option BEFORE the Boost libraries does not

    /usr/bin/cc -fPIC -O2 -g -DNDEBUG -lstdc++ -shared -Wl,-soname,HelloWorld.so ...Lots of Boost Libraries...