Question

Il est pas très difficile à briser en arrière-compatibilité binaire d'une bibliothèque DSO / shared avec une interface C ++. Cela dit, est-il un outil d'analyse statique, ce qui peut aider à détecter de telles ruptures ABI, si elle a donné deux ensembles de fichiers d'en-tête: ceux d'un état antérieur de l'ASM et ceux de l'état actuel (et peut-être DSO aussi)? Les deux suggestions de produits gratuits et commerciaux sont les bienvenus.

Si l'on pouvait aussi mettre en garde contre les mauvaises pratiques, par exemple fonctions en ligne et les paramètres de fonction dans les interfaces DSO en défaut, ce serait bien.

Était-ce utile?

La solution

Je suppose que vous êtes familier avec ce tutoriel: Problèmes de compatibilité binaire avec C ++ , sinon lire!

Je l'ai entendu parler de cet outil: http://ispras.linuxbase.org/index.php/ABI_compliance_checker , mais jamais testé ou utilisé un, donc sans opinion.

Aussi cela peut vous intéresser: Création bibliothèque avec rétrocompatible ABI qui utilise Boost

Autres conseils

abi-conformité vérificateur - un outil de vérification binaire en arrière / source- compatibilité au niveau d'une bibliothèque partagée ++ C / C (DSO):

  

Un outil pour vérifier la compatibilité binaire et vers l'arrière au niveau de la source d'une bibliothèque de C / C ++. L'outil vérifie en-tête des fichiers et des bibliothèques partagées de versions anciennes et nouvelles et analyse l'évolution de l'API et ABI (ABI = API + compilateur ABI) qui peut casser binaire et / ou de compatibilité sources: les changements dans l'appel pile, les changements v-table, symboles retirés , les champs renommés, etc.

     

icheck - Interface C ABI / API vérificateur:

  

Outil de vérification statique des interfaces C pour API et ABI changements. Tous les changements de type de déclarations qui peuvent provoquer des changements ABI doivent être détectés, ainsi que la plupart des modifications de l'API.   icheck est destinée à être utilisée avec des bibliothèques, comme un procédé de prévention de la dérive ABI.

shlib-compat - compatibilité ABI checker pour les bibliothèques partagées avec le symbole versioning:

  

shlib-compat utilise des symboles de débogage naines pour recréer et comparer les définitions des exportées   les symboles, y compris les arguments de la fonction et le type de structure.

Aussi, vous pourriez être intéressé par le Tracker amont linux et noreferrer services linux tracker abi. Ils sont tous deux alimentés par l'outil abi-conformité vérificateur.

Je me souviens au travail qu'ils ont utilisé GCC XML pour tester la compatibilité binaire. Fondamentalement, ce qu'il fait est de générer une représentation XML de l'arborescence d'objets du compilateur. La théorie est que si le xml est équivalent, ils la compatibilité binaire a été maintenue.

La seule façon sûre de le faire est d'exporter votre bibliothèque à l'aide d'une interface C. Une bibliothèque C ++ est uniquement compatible avec celui compilateur que vous utilisez pour compiler.

outil C de Smart Differencer compare deux différences fichiers source et les rapports en termes des structures linguistiques (identificateurs, expressions, déclarations, ...) et des actions d'édition plausibles (insérer, supprimer, déplacer, copier, remplacer identificateur, ...).

Il ne répond pas à la question ABI directement, mais les informations qu'il fournit peut-être assez utile. Un exemple discuté dans une autre réponse est de changer de rendement de type struct {a, b} struct {b, a} . SmartDifferencer signale que, a été déplacé. (Note: un outil de comparaison régulière ferait rapport de la cette ligne contenant la définition de struct a été modifiée, de sorte que vous obtenez un peu la même information, mais SmartDifference ne tient pas compte des changements dans les espacements / mise en page et les commentaires aussi, produisant moins de bruit conceptuel).

Qu'est-ce qu'aucun de ces outils fera rapport est le changement de la définition d'un typedef, il est dans un autre fichier d'en-tête. Mais on peut supposer que l'on compare tous les fichiers d'en-tête impliqués. Si vous ne voulez pas le faire manuellement, quel que soit l'outil est utilisé doit essentiellement un analyseur inclus C ++ complet, résolveur nom, et doit comparer les déclarations d'équivalence. Une autre affiche a suggéré à peu près cette réponse: comparer la sortie de gccxml d'équivalence. Je ne suis pas sûr de la facilité qui est en pratique; il ne peut pas être juste « sont les fichiers XML même dans l'ordre? ».

ABI - Application Binary Interface se résume à la façon dont le compilateur traduit le code source dans la machine des instructions reconnaissables. la même ligne de source peut être traduite à différents flux d'octets, dans le programme final.

un analyseur statique en cours d'exécution sur le code source ne sera pas en mesure de prédire comment le compilateur traduire. cette décision est prise dans le codage ou paramètres compilateur. donc je ne crois pas un analyseur statique sera utile dans ce cas, vous.

scroll top