I know, this question has been asked quite some times, however I can't find a solution for my problem.
I have the following situation:
A
/ \
/ \
B <-- C
- A is a shared library which contains the class
EException
- B and C link against A
- C is a shared library as well
- B dynamically loads C at runtime
At some point C throws an instance of EException
:
void doSometing() {
throw EException("test-message");
}
in B
I would like to catch this exception:
try {
doSomething();
} catch (const EException& ex) {
// Not reached
} catch (...) {
// Not reached
}
but as mentioned in the code, neither one of the catch clauses get called. Instead the thread, this code is executed in, gets aborted.
I tried the following things:
- The visibility attribute of
EException
is set to "default" when compiling A - The
EException
header file contains declarations only - I am using the linker option
-fvisibility=hidden
in A, B and C - I am using the linker option
-E
in C
Using nm
I get for A
:
0000000000066260 T EException::EException(QString const&)
0000000000066306 T EException::EException(EException const&)
00000000000661d0 T EException::EException()
0000000000066260 T EException::EException(QString const&)
0000000000066306 T EException::EException(EException const&)
00000000000661d0 T EException::EException()
00000000000664de T EException::~EException()
000000000006641e T EException::~EException()
000000000006641e T EException::~EException()
00000000000663b6 T EException::operator=(EException const&)
<...>
000000000028de40 V typeinfo for EException
000000000028dd80 V typeinfo for EException*
000000000007342b V typeinfo name for EException
0000000000072ab7 V typeinfo name for EException*
000000000028de00 V vtable for EException
for B
:
U EException::EException(QString const&)
U EException::~EException()
<...>
0000000000726f60 V typeinfo for EException
and for C
:
U EException::EException(QString const&)
U EException::~EException()
<...>
U typeinfo for EException
Could the problem be, that B
uses its own typeinfo of EException
, while C
uses the one provided by A
? How would I fix this?
My environment:
- gcc 4.6.3 on x86_64-linux-gnu
- using Qt
Thank you for your help!