Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Undefined symbol : typeinfo for eckit::Exception

16 views
Skip to first unread message

jerr...@gmail.com

unread,
Oct 19, 2016, 6:55:13 AM10/19/16
to
Hi,

I'm stuck on a runtime error "undefined symbol: _ZTIN5eckit9ExceptionE" with a shared library libMagPlus.so. There was no error while building it, the error just was raised at runtime when Python module loading it.

Symbol '_ZTIN5eckit9ExceptionE' was demangled into a readable symbol 'typeinfo for eckit::Exception'

Checked with nm, the undefined symbol '_ZTIN5eckit9ExceptionE' is from a static library libOdb.a, which was static linked into libMagPlus.so, like this


nm -Cl libOdb.a | grep -i "eckit::Exception"

<code>
U eckit::Exception::Exception(std::string const&, eckit::CodeLocation const&) /opt/src/OdbAPI-0.10.2-Source/eckit/src/eckit/exception/Exceptions.h:84
U eckit::Exception::~Exception() /opt/src/OdbAPI-0.10.2-Source/eckit/src/eckit/exception/Exceptions.h:108
0000000000000000 W eckit::Exception::retryOnClient() const /opt/src/OdbAPI-0.10.2-Source/eckit/src/eckit/exception/Exceptions.h:48
0000000000000000 W eckit::Exception::retryOnServer() const /opt/src/OdbAPI-0.10.2-Source/eckit/src/eckit/exception/Exceptions.h:47
0000000000000000 W eckit::Exception::terminateApplication() const /opt/src/OdbAPI-0.10.2-Source/eckit/src/eckit/exception/Exceptions.h:49
0000000000000000 W eckit::Exception::what() const /opt/src/OdbAPI-0.10.2-Source/eckit/src/eckit/exception/Exceptions.h:46
U eckit::Exception::print(std::ostream&) const
U typeinfo for eckit::Exception
</code>

I also tried to unpack all object files from libOdb.a and relink libMagPlus.so with all of them with option '-fvisibility=default -rdynamic', like this

<code>
ar x libOdb.a ( ./Odb )

/usr/bin/g++ -fvisibility=default -rdynamic -fPIC -pipe -O2 -g \
-Wl,--disable-new-dtags -shared \
-Wl,-soname,libMagPlus.so -o ../lib/libMagPlus.so \
... ... \
./Odb/*.o \
... ...

</code>

But still got these undefined symbols

<code>
U eckit::Exception::~Exception() /opt/src/OdbAPI-0.10.2-Source/eckit/src/eckit/exception/Exceptions.h:108
U eckit::Exception::print(std::ostream&) const
U typeinfo for eckit::Exception
<code>

Here are the the header that defines eckit::Exception class.

<code>
Exceptions.h

/// @brief General purpose exception
/// Derive other exceptions from this class and implement then in the class that throws them.
class Exception : public std::exception {

public: // methods

/// Constructor with message
Exception(const std::string& what, const CodeLocation& location = CodeLocation() );

/// Destructor
/// @throws nothing
~Exception() throw();

virtual const char *what() const throw() { return what_.c_str(); }
virtual bool retryOnServer() const { return false; }
virtual bool retryOnClient() const { return false; }
virtual bool terminateApplication() const { return false; }

static bool throwing();
static void exceptionStack(std::ostream&,bool callStack = false);

const std::string& callStack() const { return callStack_; }

protected: // methods

void reason(const std::string&);
Exception();

virtual void print(std::ostream&) const;

private: // members

std::string what_; ///< description
std::string callStack_; ///< call stack
SavedStatus save_; ///< saved monitor status to recover after destruction
Exception* next_;
CodeLocation location_; ///< where exception was first thrown

friend std::ostream& operator<<(std::ostream& s,const Exception& p)
{
p.print(s);
return s;
}
};

</code>


I knew little about C++, and have no idea how to get this fixed. Wondering if needs to touch Exceptions.h and how to touch it ?

Anybody can help ?

Appreciating your time

Regards
0 new messages