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

 C Discussion :

Compiler avec une autre version de glibc ?


Sujet :

C

  1. #1
    Membre habitué
    Homme Profil pro
    Doctorant en Astrophysique
    Inscrit en
    Mars 2009
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Astrophysique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2009
    Messages : 312
    Points : 176
    Points
    176
    Par défaut Compiler avec une autre version de glibc ?
    Bonjour.

    Je suis sous Ubuntu 12.10 et je cherche à compiler un programme tout simple test.c avec une version différente de glibc. Par défaut mon système a glibc-2.15 et j'ai téléchargé et compilé glibc-2.17.

    Mes répertoires sont les suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /mydirectory/glibc-2.17 (extraction de glibc-2.17)
    /mydirectory/glibc-2.17-build (glibc-2.17 compilée)
    /mydirectory/test/test.c (mon programme de test)
    Mon programme de test est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdlib.h>
    #include <stdio.h>
    #include <features.h>
     
    int main(int argc, char* argv[])
    {
       int major = __GLIBC__;
       int minor = __GLIBC_MINOR__;
       printf("glibc version = %d.%d\n", major, minor);
       return 0;
    }
    Si je me place dans /mydirectory/test/, que je compile avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -Wall -Wextra -O3 test.c -o test
    et que j'éxécute avec ./test, j'obtiens :
    J'utilise donc la version installée par défaut sur mon système.

    Ma question est : comment compiler et exécuter ce petit programme avec glibc-2.17 ?

    (je ne maîtrise pas totalement les options de compilation, donc lorsque vous indiquez une option/commande à mettre, merci d'écrire explicitement tout ce qu'il faut tapper pour que je vois à quoi cela ressemble).

    Merci beaucoup .

  2. #2
    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
    Bonjour,
    à la compilation/édition de liens, il faut stipuler un
    -L/mydirectory/glibc-2.17 -lje ne sais pas quoi
    à l'execution, ce sera
    LD_LIBRARY_PATH=/mydirectory ./test
    cependant, pour la libc, je ne sais pas exactement comment agir exactement.
    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

  3. #3
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Bonjour,

    Autant avoir plusieurs libc installées ne pose pas de problèmes particuliers (enfin pas trop), autant avec les version dev est un peu plus compliqué.

    La libc est un composant essentiel de ton système. Si tu crées un programme simple (= plus ou moins monolithique ne faisant pas appel à d'autres bibliothèques) il n'y aura pas de problèmes. Si ton programme utilise une autre bibliothèque qui elle requiert un version différente de la libc il peut potentiellement y avoir des problèmes (symbole manquant ou fonction ayant un comportement un peu différent, etc).
    C'est pourquoi quand on upgrade la libc il est toujours mieux d'upgrader tout ce qui l'utilise (en gros la quasi totalité de ton système), c'est mieux pas obligatoire ...

    Venons-en à ta question, en googlant un peu on remarque vite qu'il y a pas mal de référence sur des sites comme stackoverfloz, linuxquestions, ...
    Il y a pas mal de réponses qui parfois sont assez différentes, même un howto de la glibc il y a en a un qui date de 1998 (oui, le XXe siècle).
    En gros la démarche est toujours la même du côté gcc
    • pointer vers les bons headers
      utiliser l'option -nostdinc qui «débranche» la recherche des include<> dans les chemins par défauts (=celui de la libc courante), avec l'option -I (i majuscule) pour lui donner les nouveaux chemins à chercher;
    • lier avec les bonnes bibliothèques
      à nouveau on utilise une option pour «débrancher» le link automatique vers la libc courante avec -nodefaultlibs ou -nostdlib. Ces deux options sont un peu différentes, mais j'y reviendrai plus tard. Ensuite il faut via les options -L et -l (L minuscule) donner le chemin et les noms des bibliothèques que tu veux lier. Certaines réponses donnent d'autres options qui sont passées directement au linker.


    Pour comprendre la différence entre -nodefaultlibs et -nostdlib il faut comprendre comment un exécutable est chargé. Pour cela une commande est utile : ldd ; cette commande va te permettre de connaître quelles sont les bibliothèques nécessaires pour exécuter un programme et où le système les trouve, cela t'évitera un détour par les macros de version de la libc. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ ldd test
    	linux-vdso.so.1 =>  (0x00007fffb0527000)
    	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff8ae478000)
    	/lib64/ld-linux-x86-64.so.2 (0x00007ff8ae855000)
    le programme test aura besoin de la libc, et du loader 64bit made in linux = le programme qui charge le fichier exécutable en mémoire, prépare tout, charge les bibliothèques si nécessaire, et tout ça et qui va donner la main au point d'entrée de ton programme (qui n'est pas le main de tes sources !). La libc et le loader sont liés d'une manière transparente sans que tu aies à t'en préoccuper : ce sont les default libs. Donc si tu utilises les -nodefaultlibs il faudra les lier à la main en les donnant à gcc ...
    L'option -stdlib va encore plus loin, en effet comme je l'ai souligné au paragraphe précédent, ton main ne sera pas appelé immédiatement, une autre routine est appelée qui elle va appeler ton main. -stdlib va aussi bypasser cette routine qui se trouve dans un fichier crt1.o (C RunTime, je crois). Donc si tu utilises cette option il va falloir aussi lui fournir à gcc ce fichier objet (qui se trouve normalement quelque part dans /usr/lib, qui dépend de la libc ??? je ne sais pas ... à creuser).
    Puis en dernier lieu, il faut aussi apparemment lier une bibliothèque fournie par gcc (libgcc.a) qui contient les aspects spécifiques à ton système.

    Conclusion : cela peut-être assez complexe à mettre en oeuvre suivant ce que tu désires faire. D'ailleurs souvent il est conseillé de se créer un environnement chrooté pour faire des tests avec une version dev de la libc si cela impacte plusieurs programmes et bibliothèques. Mais cela peut aussi s'avérer très formateur. Je n'ai pas plus de temps pour t'orienter ... en cela google est ton ami.
    Te seront utiles la doc gcc, la doc glibc, de la persévérance et du courage (je n'ai que des larmes à promettre).
    Néanmoins si tu y arrives je pense que poster ta solution sera profitable à de nombreuses personnes par la suite.

Discussions similaires

  1. Importer un projet réalisé avec une autre version de Qt
    Par RedSkidy dans le forum Qt Creator
    Réponses: 1
    Dernier message: 20/09/2014, 15h32
  2. Compiler Qt 5 sous Linux avec une autre version de GCC
    Par uriotcea dans le forum Débuter
    Réponses: 2
    Dernier message: 15/04/2014, 09h39
  3. Compiler pour une autre version Office
    Par Pascal Lob dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 09/12/2008, 18h22
  4. Activation Ultimate avec clé d'une autre version
    Par slim dans le forum Windows Vista
    Réponses: 5
    Dernier message: 26/02/2007, 15h30

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