Forum Linux.général Compatibilité binaire

Posté par  .
Étiquettes :
2
16
avr.
2012

Bonjour,

Voici une question simple à laquelle je n'ai pas encore trouvé de réponse satisfaisante :

Comment savoir si un binaire construit sur une machine donnée s'exécutera sur une autre de même architecture ?

En gros, si je compile sur Fedora 15, est-ce que je pourrai exécuter sur Fedora 14 ou 16, ou même Ubuntu 10.04 ?

Par expérience, je n'ai pas souvent vu d'incompatibilité descendante, mais j'aimerais en savoir plus.

Merci d'avance.

  • # Librairies?

    Posté par  (site web personnel) . Évalué à 3.

    C'est plutôt au niveau des librairies qui risquent de manquer, ou d'avoir des version incompatibles (fonctionnalités manquantes) ou ca risque de coincer…

    • [^] # Re: Librairies?

      Posté par  . Évalué à 3.

      C'est plutôt au niveau des librairies qui risquent de manquer, ou d'avoir des version incompatibles […]

      La partie bibliothèques ne pose pas trop de problème, imagions un hello world ou équivalent.

      Le cas particulier que j'ai en tête n'utilise que la bibliothèque du C et n'est supporté que pour Red Hat 5 (de tête), mais fonctionne −a priori− sans problème sur fedora, ubuntu…

      • [^] # Re: Librairies?

        Posté par  . Évalué à 5.

        deux choses à verifier :
        - 32 ou 64bits
        - les dependances à des bibliotheques

        une fois que tu as verifié ca, ca va rouler tout seul.

        • [^] # Re: Librairies?

          Posté par  . Évalué à 2.

          Et comment ça se passe coté noyau ?

          • [^] # Re: Librairies?

            Posté par  . Évalué à 4. Dernière modification le 17 avril 2012 à 00:13.

            coté noyau

            bah 32 ou 64bits doit deja te permettre de savoir.

            sauf si tu comptes vraiment faire des programmes bas niveaux en assembleur ou utilisant des instructions non-generiques (AVX/AVX2 qui ne sont pas encore dans tous les processeurs)

            • [^] # Re: Librairies?

              Posté par  . Évalué à 1.

              Bon, bah ok, merci.

              Je pensais que la version du noyau avait une grosse influence…

              merci encore.

              • [^] # Re: Librairies?

                Posté par  . Évalué à 4.

                Je pensais que la version du noyau avait une grosse influence…

                Et bien ça dépend de ce que tu fais: bien sûr si tu utilise une fonctionnalité récente (genre cgroup) et qu'ensuite tu essaye d'utiliser un kernel plus vieux, ça peut ne pas marcher, sinon les devs du kernel (mais ce sont bien les seuls, dommage..) prennent très au sérieux la compatibilité ascendante.

              • [^] # Re: Librairies?

                Posté par  . Évalué à 2. Dernière modification le 17 avril 2012 à 11:02.

                la version du noyau avait une grosse influence

                comme tu le dis, il fut un temps ou le noyau prenait des binaires au format a.out
                depuis il est passé au format ELF et a progressivement abandonné le format a.out

                mais comme le dise les autres et moi meme un peu plus haut, ca depend de ce que tu veux faire.

                c'est sur que si tu veux faire un pilote pour ton peripherique maison, il faudra surement se poser la question du noyau pour lequel tu veux que ton pilote fonctionne.

                mais si tu veux juste faire un programme utilisateur ton seul probleme ce sera les bibliotheques que tu vas utiliser et leur fonctionnalité.

                et ce sont ces bibliotheques plus que le noyau dont tu devras te mefier.

                • [^] # Re: Librairies?

                  Posté par  . Évalué à 1.

                  c'est sur que si tu veux faire un pilote pour ton périphérique maison, il faudra surement se poser la question du noyau pour lequel tu veux que ton pilote fonctionne.

                  Mon interrogation venait de là justement :

                  j'ai lu dans linux device drivers 3 qu'un pilote −ou un module noyau en général− ne pouvait être construit que pour une version donnée. Et ne comprenais pas comment mes softs pouvaient fonctionner d'une distrib' à l'autre.

                  • [^] # Re: Librairies?

                    Posté par  . Évalué à 2.

                    dans linux device drivers 3 qu'un pilote −ou un module noyau en général− ne pouvait être construit que pour une version donnée

                    Et ne comprenais pas comment mes softs pouvaient fonctionner d'une distrib' à l'autre

                    peut-etre simplement parce que tes "softs" ne sont pas des modules noyaux
                    ils communiquent avec le noyau pour aller lire/ecrire des données sur un port serie, un port reseau, un socket

                    mais comme les devs noyaux font ca bien, c'est ce qu'on appelle les API, c'est un standard qui ne doit pas changer à chaque version du noyau, justement pour ne pas casser le fonctionnement.

                  • [^] # Re: Librairies?

                    Posté par  . Évalué à 7.

                    En fait, il y a deux interfaces pour le noyau, une interne pour que les différents modules du noyau communiquent entre eux et une externe pour que les programmes communiquent avec le noyau. L'interface interne change régulièrement sans aucune compatibilité assurée, l'interface externe assure la compatibilité pendant très longtemps.

                    « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

                    • [^] # ldd

                      Posté par  . Évalué à 3.

                      un élément de réponse peut être donné avec la commande ldd qui liste le détail des bibliothèques liées (avec leur version) :

                      par exemple, avec un programme simple en ligne de commande :

                      ldd /usr/bin/frotz 
                              linux-vdso.so.1 =>  (0x00007fff43e86000)
                              libncursesw.so.5 => /usr/lib/libncursesw.so.5 (0x00007f0f47282000)
                              libc.so.6 => /lib/libc.so.6 (0x00007f0f46ee1000)
                              /lib/ld-linux-x86-64.so.2 (0x00007f0f474df000)
                      
                      

                      Only wimps use tape backup: real men just upload their important stuff on megaupload, and let the rest of the world ~~mirror~~ link to it

        • [^] # Re: Librairies?

          Posté par  (site web personnel) . Évalué à 2.

          Pour chaque bibliothèque dynamique, il faut vérifier que tu la retrouves dans une version compatible binaire, cad avec les mêmes signatures de fonctions, les mêmes tailles de structures, compilée avec le même compilateur avec les mêmes options de compilation sur toutes les distributions…

          Sauf cas particulier, c'est mission impossible et il vaut mieux tout lier en statique.

          Ou utiliser un langage interprété :-)

          Le post ci-dessus est une grosse connerie, ne le lisez pas sérieusement.

      • [^] # Re: Librairies?

        Posté par  . Évalué à 6.

        Attention! Gcc peut linker des bibliothèques internes que tu n'as pas spécifié. Dans tous les cas, si tu veux augmenter la portabiité, compile en statique.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.