Question about Darwin GCC and weak symbol tagging policy

Wed Jan 12 19:49:00 GMT 2011


I am trying to use dynamic_cast to upcast object pointers generated by
object factories. Each factory belong to a separate dynamic shared object
(OSX bundles in this case), and GCC fails the cast in few cases (and
succeeds in the others). 

In order to understand the problem, I've created a factory that creates an
empty object (only a CTOR and a  virtual DTOR). When the destructor is
inline, everything works fine (the CTOR's definition is in a .cpp). However,
as soon as I move the destructor's definition to the .cpp, the dynamic_cast

I looked at the symbols in each case (nm -m <bundle-file>) and found that
the only differences were that the symbols associated with the empty class
are declared weak extern in the binary where the destructor is inline and
extern in the other binary.

Here is my understanding of the problem: dynamic_cast can only succeeds in
GCC if both object's typeinfo have the same address. If there are several
definitions of the same class in different DSOs, then some of the duplicated
symbols associated to those definitions have to be marked as weak in order
to be coalesced to enforce the one definition rule (ODR).

This is exactly what doesn't happen when my empty class has its constructor
defined in the .cpp. I've stumbled on a bug report  relating to
GCC on Darwin which adjusted GCC's behavior regarding vtables to compensate
a restriction from the linker on Darwin.

Because of this change, each duplicated symbol related to an empty object is
marked as non-weak and will have its own typeinfo object (and its own
typeinfo pointer), which will cause dynamic_cast to fail on GCC.

In order to revert this behavior, I need to have a 'key function' in my

So here are my two questions:

What qualifies as a key function (I've tried several dummy function
prototypes, but none solved my problem)?

Where can I find some guidelines about the way I should code my classes so
that gcc marks symbols as weak on Darwin?

I've looked for answers for both questions for several days with no success.
Your help will be greatly appreciated.
Thank you very much in advance,

View this message in context:
Sent from the gcc - Help mailing list archive at

More information about the Gcc-help mailing list