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

Ada Discussion :

Compiler avec GNAT sous Linux sans dépendances dynamique à libgnat et libgnarl


Sujet :

Ada

  1. #1
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Points : 493
    Points
    493
    Par défaut Compiler avec GNAT sous Linux sans dépendances dynamique à libgnat et libgnarl
    Pfffffff.... grosse deception

    Je viens enfin d'installer Debian sur une machine annexe, à défaut de pouvoir faire de la cross compilation Ada pour Linux depuis Windows.

    Je compile sous Debian, je copie les fichiers sur le serveur (un serveur Debian/Linux), et là, j'obtiens un beau message d'erreur qui me dit que libgnat est introuvable.

    Seulement, je ne peux bien sûr pas installer de librairie, car c'est un serveur mutualisé. J'ai bien tenté de simplement copier dans librairie dans le repertoire de l'executable, et delui donner l'attribut d'execution, mais sans que ça n'ai le moindre effet : toujours le même message d'erreur de librairie introuvable.

    J'ai tenté de passer l'option "-static" à gnatmake, mais le résultat est le même. Apparement -static ne semble s'appliquer qu'à la runtime, donc libgnarl, et non pas à libgnat.

    Sous Windows, les exe produit par GNAT (3.15p) ne dépendait d'aucune librairie particulière, et je pensais naïvement qu'il en serait de même sous Linux. Mais que-neni mes chèr(e)s....

    Est-il possible de compiler des executables avec GNAT (3.15p), qui pourront fonctionner sous n'importe quel Linux standard et basique ? En d'autres mots : est-il possible de générer avec GNAT, des applications qui ne dépendent que de la libc ? (libc6 en l'occurence)

    Ou est-ce que je dois vraiment abandonner tout espoir finalement de passer à Ada pour toutes mes applications ?

    ------ EDIT et solution ---------------
    Solution : il aut invoquer le compilateur en trois étapes
    Voir explications dans le post #5

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    linux# gnatmake -f -c test.adb
    linux# gnatbind -static test.ali
    linux# gnatlink test.ali
    linux# strip test
    ------------------------------------------------------------
    Sur le web, c'est la liberté qui est gratuite, mais bien évidement pas la consomation ... et encore moins la consomation à outrance
    ------------------------------------------------------------
    Language shapes the way we think, and determines what we can think about [ B. Lee Whorf ] ... mais ce n'est pas tout à fait vrai à 100%...
    ------------------------------------------------------------
    Pascal (FreePascal?) - Ada (Gnat-3.15p)
    XSLT (XSLTProc) - CGI binaires (Ada/C) [ Clavier Arabe ]
    ------------------------------------------------------------

  2. #2
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Points : 493
    Points
    493
    Par défaut
    Je me creusais : en fait, dans cette installation de GNAT sous Debian, on trouve libgnat-4.1.so.1 et libgnarl-4.1.so.1. Ce sont donc des librairies à liaisons dynamique. Ors, il faudrait des libgnat-4.1.a et libgnarl-4.1.a (librairies à liaison statique).

    Mais une recherche google sur libgnat-4.1.a dans le contenu des package sur le site de Debian ne donne aucun résultat, et même une recherche Google n'en dit pas plus (seulement trois page renvoyé).

    On rencontre en effet plutôt libgnat.a, qui est la librairie statique de GNAT pour Windows.

    Apparement donc, comme c'est l'habitude avec la libc qui est liée dynamiquement, il semble que sous Linux le même principe soit appliqué à libgnat.

    Mais je pense que logiquement, il doit être possible de créer automatiquement une version statique d'une librairie, même sans en avoir les sources.

    Mais là c'est plutôt une question de developpement sous Linux. Je vais donc poser la question dans le forum Linux, et je retransmet la réponse ici dès que j'en obtiens une.

    Je pense qu'aprés cela, la question sera résolue.
    ------------------------------------------------------------
    Sur le web, c'est la liberté qui est gratuite, mais bien évidement pas la consomation ... et encore moins la consomation à outrance
    ------------------------------------------------------------
    Language shapes the way we think, and determines what we can think about [ B. Lee Whorf ] ... mais ce n'est pas tout à fait vrai à 100%...
    ------------------------------------------------------------
    Pascal (FreePascal?) - Ada (Gnat-3.15p)
    XSLT (XSLTProc) - CGI binaires (Ada/C) [ Clavier Arabe ]
    ------------------------------------------------------------

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 90
    Points : 100
    Points
    100
    Par défaut
    Parfois il suffit de taper la commande suivante avant d'exécuter un programme sur Linux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    export LD_LIBRARY_PATH=repertoire_des_lib:$LD_LIBRARY_PATH

  4. #4
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Points : 493
    Points
    493
    Par défaut
    La solution ne convient pas quand il s'agit d'executions non commandées par l'utilisateur. Par exemple pour du CGI, cela ne fonctionnera pas.

    Ou alors, il faudrait pouvoir lier en indiquant que la librairie dynamique se trouvera dans le repertoire de l'application.

    Le repertoire de l'application peut faire partie du chemin de recherche des librairie dynamique pour ld.so/ld-linux.so. Mais ce comportement peut aussi être empêché, et je pense qu'un serveur est probablement configuré de cette manière pour raison de sécurité.

    Il faut vraiment une solution qui fonctionne naturellement, sans aucune manipulation préalable à l'execution de l'application.

    Donc il faudrait une librairie statique à partir de sa version dynamique. Mais le ELF, c'est le ELF, et en extraire des fichiers objets pour les remettre dans une archive *.a, je ne vois pas trop comment finalement.

    Je sais que dans les fichiers ELF, est indiqué le chemin du chargeur dynamique, mais pas celui des librairie dynamiques prisent individuellement. Donc pas de solution non-plus de ce coté là.

    Je sais bien que je dois avoir l'air embêtant, et on pourra me dire que le cas des CGI est particuliers, mais en même temps, je pense que trouver une solution à ce cas serait utile pour tout le monde : c'est quand-même préférable de trouver une solution qui fait que l'application s'execute naturellement.

    J'avais trouvé un version statique de libgnat dans un RPM RedHat, mais apparement elle n'est pas compatible (j'obtiens des erreurs de symboles non trouvés)

    Sinon, je vais voir du coté des sources, pour voir si je peux construire cette version statique.
    ------------------------------------------------------------
    Sur le web, c'est la liberté qui est gratuite, mais bien évidement pas la consomation ... et encore moins la consomation à outrance
    ------------------------------------------------------------
    Language shapes the way we think, and determines what we can think about [ B. Lee Whorf ] ... mais ce n'est pas tout à fait vrai à 100%...
    ------------------------------------------------------------
    Pascal (FreePascal?) - Ada (Gnat-3.15p)
    XSLT (XSLTProc) - CGI binaires (Ada/C) [ Clavier Arabe ]
    ------------------------------------------------------------

  5. #5
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Points : 493
    Points
    493
    Par défaut
    Je cherchais une libgnat-4-1.a, alors qu'il existe la libgnat.a

    Première erreur.

    Deuxième erreur : je passais l'argument "-static" à gnatmake, alors qu'il faut le passer à gnatbind.

    Comme pour passer un argument à gnatbing il faut l'invoquer lui-même, il ne faut pas laisser gnatmake l'appeler. Et si on ne laisse pas gnatmake appeler gnatbind, il ne pourra pas appeler gnatlink, puisque gnatlink vient aprés gnatbind.

    Il faut donc appeler les trois séparement.

    Et voici donc comment il faudra procéder pour compiler en utilisant les versions static des lib* de GNAT :

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    linux# gnatmake -f -c test.adb
    linux# gnatbind -static test.ali
    linux# gnatlink test.ali
    linux# strip test

    Agrémentez à votre convenance ...

    Le strip final s'impose véritablement, parce que le fichier obtenu pèse au minimum 113KB (un vieux problème de GNAT -> http://www.developpez.net/forums/sho...d.php?t=203418). La taille du binaire est environ 2 fois plus grosse qu'avec un FPC par exemple, mais ça vaut la peine

    J'ai testé... ça marche, et plus d'erreur sur le serveur, et ça doit donc fonctionner partout (sous reserve de libc compatible)

    Voilà (hibou content)
    ------------------------------------------------------------
    Sur le web, c'est la liberté qui est gratuite, mais bien évidement pas la consomation ... et encore moins la consomation à outrance
    ------------------------------------------------------------
    Language shapes the way we think, and determines what we can think about [ B. Lee Whorf ] ... mais ce n'est pas tout à fait vrai à 100%...
    ------------------------------------------------------------
    Pascal (FreePascal?) - Ada (Gnat-3.15p)
    XSLT (XSLTProc) - CGI binaires (Ada/C) [ Clavier Arabe ]
    ------------------------------------------------------------

  6. #6
    Invité
    Invité(e)
    Par défaut
    Merci Hibou57 pour tes recherche.
    Il me semble que pour obtenir un objet statiquement lié l faille ajouter l'option "-static" à la liaison.

    Voici mon makefiile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    obj=".obj/"
    bin="bin/"
    src="src/"
    lib="lib/"
    target="main"
     
    .PHONY: $(target)
     
    default:
            @echo "Precisez le nom de la ciblle :"
            @echo "- main ;"
            @echo "- clean ;"
            @echo "- mrproper."
     
    main:
            gnatmake -c -D $(obj) $(src)$(target) -aI$(src)$(lib)
            gnatbind -static $(obj)$(target).ali
            gnatlink -static $(obj)$(target).ali -o $(bin)$(target) 
            strip $(bin)$(target)
     
    clean:
            rm -f $(obj)*.o
            rm -f $(obj)*.ali
     
    mrproper:
            rm -f $(bin)$(target) 
            rm -f $(src)*~
            rm -f $(src)$(lib)*~

  7. #7
    Membre actif

    Homme Profil pro
    Mathématicien et développeur
    Inscrit en
    Mars 2012
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Mathématicien et développeur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2012
    Messages : 132
    Points : 241
    Points
    241
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par jovalise Voir le message
    Merci Hibou57 pour tes recherche.
    Il me semble que pour obtenir un objet statiquement lié l faille ajouter l'option "-static" à la liaison.

    Voici mon makefiile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    obj=".obj/"
    bin="bin/"
    src="src/"
    lib="lib/"
    target="main"
     
    .PHONY: $(target)
     
    default:
            @echo "Precisez le nom de la ciblle :"
            @echo "- main ;"
            @echo "- clean ;"
            @echo "- mrproper."
     
    main:
            gnatmake -c -D $(obj) $(src)$(target) -aI$(src)$(lib)
            gnatbind -static $(obj)$(target).ali
            gnatlink -static $(obj)$(target).ali -o $(bin)$(target) 
            strip $(bin)$(target)
     
    clean:
            rm -f $(obj)*.o
            rm -f $(obj)*.ali
     
    mrproper:
            rm -f $(bin)$(target) 
            rm -f $(src)*~
            rm -f $(src)$(lib)*~
    Encore plus simple - en 1 commande - s'agissant de gnatmake:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gnatmake ... -bargs -static
    ou, en utilisant un projet (.gpr):
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       package Binder is
          for Default_Switches ("ada") use ("-static");
       end Binder;
    dans le fichier de projet (exemple.gpr).
    Un exemple d'exécutable construit sous Ubuntu 11.10 avec le GNAT par défaut, et tournant sous un autre *N*X : http://cbsg.sf.net

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Zerte Voir le message
    Encore plus simple - en 1 commande - s'agissant de gnatmake:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gnatmake ... -bargs -static
    Ben non, ça ça marche pas sur ma bécane.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     gnatmake -f selfclient.adb -aI.. -bargs -static
    gcc-4.3 -c -I.. selfclient.adb
    selfclient.adb:70:32: warning: formal parameter "Program" is not referenced
    gcc-4.3 -c -I./ -I.. -I- /home/root/Ada/SelfProg/libself.ads
    gcc-4.3 -c -I./ -I.. -I- /home/root/Ada/SelfProg/libself-program.ads
    gnatbind -aI.. -static -x selfclient.ali
    gnatlink selfclient.ali
    void:selfclient# strip selfclient
    void:selfclient# file selfclient
    selfclient: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, stripped

  9. #9
    Membre actif

    Homme Profil pro
    Mathématicien et développeur
    Inscrit en
    Mars 2012
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Mathématicien et développeur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2012
    Messages : 132
    Points : 241
    Points
    241
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par jovalise Voir le message
    Ben non, ça ça marche pas sur ma bécane.
    Caramba! Et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gnatmake ... -largs -static -bargs -static
    ?

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Zerte Voir le message
    Caramba! Et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gnatmake ... -largs -static -bargs -static
    ?
    Yep ! Ca ça marche.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Compiler de l'objectif-c avec gobjc sous Linux
    Par Toshy62 dans le forum Linux
    Réponses: 1
    Dernier message: 06/02/2011, 10h23
  2. Réponses: 3
    Dernier message: 18/06/2008, 17h27
  3. [Compilation Installation] Php avec apache sous linux
    Par c.tranquille dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 19/06/2006, 13h46
  4. [débutant]compiler avec gcc sous linux
    Par Ickou dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 10/03/2006, 17h27
  5. Problemes de compilation avec g++ sous linux
    Par Selimmel dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 19/09/2003, 13h43

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