Jusqu'à la version 3.0, GCC utilisait la comparaison des noms
des symboles pour savoir si deux types étaient équivalent. Mais
depuis la nouvelle ABI (application binary interface) il ne compare
plus les noms, mais les adresses. Cela a pour but d'améliorer les performances.
Ce choix technique ne pose aucun problème avec un "linkage" statique,
car le les adresses sont déterminées et connues du compilateur.
Contrairement aux bibliothèques partagées (.dll, .so) qui
requièrent une résolution des types à l'exécution (runtime).
En effet si nous prenons en exemple une classe C qui
implémente deux interfaces I1 et I2 définies dans l'exécutable
et dans une bibliothèque partagée. Si nous essayions d'effectuer
un dynamic_cast sur une instance de C renvoyé par la bibliothèque
partagée en I1 ou I2, dynamic_cast renvoie toujours "null".
Le problème est aussi visible via throw et typeid.
Ce problème est dû au changement dans la résolution des types
énoncés ci-dessus. Pour corriger ce problème, il faut utiliser
l'option "-rdynamic" de GCC qui a pour but de créer une "global
symbol table" dans la bibliothèque partagée. Sous Linux/BSD le
compilateur réalise cette opération en passant l'option
"-export-dynamic" au "linker".