IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques C++ Discussion :

dll : connaitre la version de mingw utilisée.


Sujet :

Bibliothèques C++

  1. #1
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut dll : connaitre la version de mingw utilisée.
    Bonjour,

    Je suis actuellement en train de porter un exécutable sous Windows et après avoir, tant bien que mal, compilé toutes les bibliothèques nécessaires, je me retrouve avec un petit problème de dll.

    En effet, lorsque je lance l'exécutable, j'ai une petite erreur :
    Le point d'entrée de procédure __gxx_personality_v0 est introuvable dans la bibliothèque de liens dynamiques libstdc++-6.dll
    Que j'avais réussi à résoudre en changeant le fichier libstdc++-6.dll utilisé par un autre mais un peu plus tard j'ai eu une erreur (de tête ) :
    Le point d'entrée de procédure __gxx_personalitysj_v0 est introuvable dans la bibliothèque de liens dynamiques libstdc++-6.dll
    Ces erreurs viendraient du fait que les dll utilisées n'auraient pas été compilée avec la même version de mingw.

    J'aimerais donc savoir si vous connaissiez une méthode pour savoir quelles dll ont été compilées avec quelle version de mingw afin de savoir lesquelles remplacer/recompiler.

  2. #2
    Membre confirmé Avatar de saad.hessane
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 315
    Points : 496
    Points
    496
    Par défaut
    Bonjour,
    Citation Envoyé par Neckara Voir le message
    ...
    J'aimerais donc savoir si vous connaissiez une méthode pour savoir quelles dll ont été compilées avec quelle version de mingw afin de savoir lesquelles remplacer/recompiler.
    Sous Linux, les programmes sont compilés au format ELF. Ce format possède plusieurs sections d'entête (section header) dont la section .comment contient le nom et la version du compilateur.
    Si le programme n'est pas "striper", on peut accéder à cette entête à l'aide de plusieurs méthode (readelf, objdump ou strings). Exemple avec strings :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strings -a libtest.so | grep -i gcc
    ou avec objdump :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objdump -s --section .comment libtest.so
    Vu que mingw contient les commandes readelf, objdump et strings, je pense (par pur spéculation) qu'elles ont été adapté au format des binaires Windows.
    Cela ne coute rien d'essayer

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Merci pour votre réponse.

    Kwariz m'avait donné une solution temporaire consistant à rechercher dans la dll grâce à (de tête) grep __gxx_personality_sj.

    J'essayerais votre méthode dès que possible

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    D'après objdump, il semblerait que les .dll soient au format
    file format pei-i386
    strings quant à lui permet d'avoir une réponse de grep beaucoup plus lisible qu'en utilisant cat.

  5. #5
    Membre confirmé Avatar de saad.hessane
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 315
    Points : 496
    Points
    496
    Par défaut
    Citation Envoyé par Neckara Voir le message
    D'après objdump, il semblerait que les .dll soient au format ...
    Il ne t'affiche pas le contenu de la section .comment parce qu’il ne trouve justement pas de section nommée .comment .
    Ne connaissant pas l'entête du fichier, pas la peine de la spécifié. Essaie avec ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objdump -s libtest.so | grep -i gcc
    Citation Envoyé par Neckara Voir le message
    strings quant à lui permet d'avoir une réponse de grep beaucoup plus lisible qu'en utilisant cat.
    C'est le but, strings est spécialisés dans les fichiers non-textuels. Mais du coup tu as pu avoir la version de GCC ?

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Avec objdump -s libtest.so | grep -i gcc ou objdump -s libtest.so | grep -i g++, je peux en effet trouver des numéro de version de gcc/g++ par contre, je ne sais pas si cela correspond à la version sj de mingw ou à l'autre version.

  7. #7
    Membre confirmé Avatar de saad.hessane
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 315
    Points : 496
    Points
    496
    Par défaut
    La version qui est mentionnée dans l'entête de l’exécutable est la version du compilateur (GCC), non pas celle de mingw.
    A toi de voir qu'elles sont les versions de mingw qui sont installées sur ta machine, et qu'elle est celle qui possède la version de GCC indiquée.

  8. #8
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Le problème c'est que mingw peut avoir la même version de gcc mais être ou non en sj.

  9. #9
    Membre confirmé Avatar de saad.hessane
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 315
    Points : 496
    Points
    496
    Par défaut
    Je pense que tu cours après le mauvais problème.
    Tu cherches à savoir pourquoi le linker te lie ton executable avec une fonction se terminant par sj ou non
    Ce que je t'ai montré plus haut c'est comment lire la version du compilateur (GCC en l’occurrence) qui a servit à compiler ton programme.
    Mais l'erreur en elle-même que tu as donné semble plus être lié à l’utilisation d’exception, qui se règle en compilant avec g++ au lieu de gcc.

  10. #10
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Je n'ai pas d'erreurs à la compilation mais à l'exécution :

    J'ai deux dll stdc++-6.dll

    Pour l'une j'ai une erreur du type :
    entrée __gxx_personality_v0 introuvable dans le fichier stdc++-6.dll
    Et quand je la remplace par la seconde je n'ai pas cette erreur mais j'ai un peu plus tard :
    entrée __gxx_personalitysj_v0 introuvable dans le fichier stdc++-6.dll

    Ces erreurs semblent provenir des dll que j'ai compilé avec code::block que je soupçonne de ne pas avoir pris le bon mingw.

  11. #11
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    As-tu essayé de recompiler tout ton projet, après l'avoir nettoyé?
    puis de tester avec les deux libs.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  12. #12
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Puisque le problème vient du besoin de linker un certain symbole, ne pourrais-tu pas rechercher le symbole personality dans tes DLL plutôt que la version?
    Il me semble qu'un symbole non défini à linker avec une DLL figure aussi dans le binaire dépendant. De cette façon tu pourrais identifier les binaires qui dépendent de la "mauvaise" version de libstdc++, non?

  13. #13
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par therwald Voir le message
    Puisque le problème vient du besoin de linker un certain symbole, ne pourrais-tu pas rechercher le symbole personality dans tes DLL plutôt que la version?
    Il me semble qu'un symbole non défini à linker avec une DLL figure aussi dans le binaire dépendant. De cette façon tu pourrais identifier les binaires qui dépendent de la "mauvaise" version de libstdc++, non?
    Oui, c'est ce que kwariz m'avait proposé de faire. Mais je me demandais s'il n'y avait pas une manière "générique"

  14. #14
    Membre confirmé Avatar de saad.hessane
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 315
    Points : 496
    Points
    496
    Par défaut
    Citation Envoyé par Neckara Voir le message
    J'ai deux dll stdc++-6.dll
    Justement, pourquoi en a tu deux?
    Mets le bin de mingw en tête de ton PATH, recompile toutes tes bibliothèques après un clean.
    Ensuite copie LA version de stdc++-6.dll utilisée lors du build dans le dossier de compilation, pour être sûre d'utiliser la bonne dll (de peur que d'autres dll se balade dans ton PATH venant d'une ancienne installation de mingw).

  15. #15
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    C'est quand même l'enfer les histoires de dll sous Windows

    Dès que j'aurais le temps j'essayerais de recompiler CEGUI et je verrais si les dll fonctionnent mieux

  16. #16
    Membre expert

    Avatar de germinolegrand
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2010
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2010
    Messages : 738
    Points : 3 892
    Points
    3 892
    Par défaut
    Un conseil pour les dll de mingw (valable pour toutes les autres dll d'ailleurs) : toujours les mettre dans le répertoire d'exécution du projet. Ainsi même si tu changes de compilateur tu gardes la version compatible à ta dernière compilation.
    Aller modifier le path est une mauvaise idée en général puisqu'on se retrouve avec un dll hell.

  17. #17
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bon, mingw, c'est un vrai enfer sous Windows, entre sa version SJLJ et sa version DW

    Est-ce qu'il n'existe pas un moyen de savoir si une dll est compatible avec un compilateur donné ?

  18. #18
    Membre expert

    Avatar de germinolegrand
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2010
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2010
    Messages : 738
    Points : 3 892
    Points
    3 892
    Par défaut
    J'ai malheureusement peur que non. Et oui c'est un véritable enfer.

  19. #19
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Je n'avais pas fait la remarque sur l'autre sujet, mais elle s'y prêtait aussi. L'absence d'ABI en C++ rend l'utilisation de bibliothèque liés dynamiquement plus galère qu'en C (par exemple), à moins d'avoir une API flat C. Ou d'utiliser un environnement compilé entièrement avec le même compilateur et les mêmes options (*).

    Tu veux pas avoir de problèmes, alors compiles et lies tout statiquement avec le même compilateur. Ça marche très bien et c'est robuste. Tu veux faire un système de plugin ? Mets le à plat et encapsule à travers du C. C'est encore le meilleur moyen d'utiliser des bibliothèques dynamiques en C++ sans avoir de problèmes.

    Sinon, tu prends ton courage à deux main, le man de gcc/mingw, l'ABI Itanium. Et tu t'assures de n'assembler que des éléments qui peuvent l'être.

    Pour la question : "savoir si une DLL est compatible avec un compilateur donné ?" Dans le cas de la bibliothèque standard, c'est quand même trivial : la dll fournit avec ton compilateur. Après si tu utilises des DLL venant d'un peu n'importe où, faut pas trop t'étonner d'avoir des problèmes.

    (*) Ça implique de recompiler toutes les dépendances si tu changes de compilateur.

  20. #20
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Merci pour ta réponse.

    Qu'entends-tu par "mettre à plat" ?

    Sinon, j'ai enfin réussi à tout compiler \o/, j'ai réussi à lancer mon programme pour qu'il plante en me disant qu'un module manque. Résultat j'ai une dernière bibliothèque à compiler... *va se chercher un câble wifi pour se pendre*

    Lorsque j'essaye de compiler cette bibliothèque ( une sous-bibliothèque de CEGUI ), j'ai, lors de l'édition des liens une référence non-trouvée : __gxx_personality_v0.

    Ce problème semble venir de la libexpat qui est pourtant écrite en C, j'ai rajouté un -lstdc++ mais sans résultats

    Donc il y a aussi des problèmes avec les .a C.

    Je pense que je vais créer un sujet dans quelques temps à ce propos.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Quel version d'allegro utiliser avec Mingw 4.7.1?
    Par ShinobiX1 dans le forum Allegro
    Réponses: 1
    Dernier message: 07/10/2013, 14h11
  2. Réponses: 4
    Dernier message: 05/01/2012, 17h26
  3. Réponses: 5
    Dernier message: 10/03/2009, 11h54
  4. [VC++] Utilisation d'une DLL écrite en C++ avec mingw.
    Par swirtel dans le forum Visual C++
    Réponses: 1
    Dernier message: 20/06/2007, 10h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo