Lost in the matrix

C/C++/C#/Java, Multithreading

   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".

2 commentaires:

Perso, j'attends surtout que tu nous fasse un article bien poilu sur les thread comme tu avais dit que tu ferai pendant le zia. Je pense que cela pourrait entre du plus grand intérêt pour tout le monde, même si j'ai déjà eu la chance de gouter aux threads by fetz_j ^^.

Molloss

Je travaille en ce moment dessus, mais cela prend beaucoup de temps de rédiger des articles à ce sujet, car je veux faire des démonstrations complètes et détaillées. Les premiers articles seront disponibles ce week-end.

Enregistrer un commentaire