Bonjour,

J'ai un programme principal qui charge dynamiquement une bibliothèque à l'exécution.

Cette bibliothèque a une interface précise :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
class IBar {
         virtual void foo(void) = 0;
         virtual void faa(void) = 0;
}
 
IBar & foo(void);
Quand je charge ma bibliothèque, je recherche donc le symbole foo et je reçoit un void *.
Sauf que ma bibliothèque peut avoir plusieurs implémentations différentes et je n'ai aucune garantie de la validité des symboles dans une implémentation.
De plus, une bibliothèque peut se retrouver invalide si elle a été compilée avec un compilateur différent que celui qui a compilé l'exécutable.

J'ai donc pensé à compiler une bibliothèque "vide" :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
class IBar {
         virtual void foo(void) = 0;
         virtual void faa(void) = 0;
}
 
IBar & foo(void){}
Celle-ci pourrait être fournie avec l'exécutable.
Dès lors, j'aurais les symboles (ex. 3fooZA_IBar_foo_faa) exacts générés par le compilateur et je pourrais les comparer avec ceux de la bibliothèque que je chargerais.

Par contre, je n'ai pas beaucoup de connaissances sur les ABI des compilateurs, est-ce que vous auriez une idée pour effectuer cette comparaison de la manière la plus efficace possible ?