Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1590 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Compilation gcc -shared -c *.c Puis archivage ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Compilation gcc -shared -c *.c Puis archivage ?

n°1350974
FrigoAcide
Posté le 21-04-2006 à 10:05:20  profilanswer
 

Bonjour à tous, je travaille en ce moment sur une application en C comprenant 2 bibliothèques, Mère et Fille. J'ai du mal à comprendre comment les compilations et les éditions de liens sont faites, pouvez-vous m'aider ?
 
On compile la Mère en dynamique : le but est d'obtenir Mère.so. Lors de l'édition de liens de Mère, on inclut Fille en statique, donc Fille.a (une archive).
 
J'étais donc parti pour compiler les sources de la Fille avec (grosso modo)
> gcc -c fille*.c -o fille*.o
> ar rv Fille.a fille*.o
 
Puis inclure Fille.a lors de l'édition de liens de la Mère :
> ld -shared mere*.o Fille.a -o Mere.so
 
Ce à quoi on m'a rétorqué : "Non non, c'est une compilation dynamique, donc on 'archive' bien les fille*.o 'dans' Fille.a, mais la compilation des sources se fait avec le flag -shared :
> gcc -shared -c fille*.c -o fille*.o
> ar rv Fille.a fille*.o (cette commande ne change pas)
"
 
Moi j'ai du mal à comprendre le truc... je pensais qu'on produisait une archive pour "faire" du statique, et un shared object pour "faire" du dynamique, mais mes notions ne sont pas très claires. Ensuite, il faut lors de l'éxecution mettre l'emplacement des .so dans le LD_LIBRARY_PATH, alors que c'est inutile pour l'archive.
 
Or là je vois que dans mon projet, on utilise l'archive "hybride" (qui contient des objets compilés en -shared) comme une archive "classique", rien de la Fille n'est inclus dans le LD_LIBRARY_PATH, on n'y trouve que le chemin vers Mere.so.
 
Quelqu'un pourra t-il m'éclairer ? Merci.


---------------
Paléoanthropologie, évolution de l'espèce humaine et préhistoire
mood
Publicité
Posté le 21-04-2006 à 10:05:20  profilanswer
 

n°1351135
olivthill
Posté le 21-04-2006 à 12:47:29  profilanswer
 

Tu as raison.
La ligne gcc -shared -c fille*.c -o fille*.o produit un fichier objet pour une bibiothèque partagée, donc externe ou dynamique. L'archivage de ce fichier devrait se faire dans ".so" au lieu d'un ".a".

n°1351251
FrigoAcide
Posté le 21-04-2006 à 14:19:13  profilanswer
 

Le man de gcc recense le flag -shared dans la catégorie 'Linker options', dont il dit "These options come into play when the compiler links object files into an executable output file.  They are meaningless if the compiler is not doing a link step."
 
Donc en théroie, si tu fais un gcc -shared -c file.c, ça revient strictement au même que de le faire sans le -shared. Sauf qu'en pratique j'ai bel et bien une différence à l'execution.


---------------
Paléoanthropologie, évolution de l'espèce humaine et préhistoire
n°1351394
++fab
victime du syndrome IH
Posté le 21-04-2006 à 16:47:29  profilanswer
 

FrigoAcide a écrit :

Donc en théroie, si tu fais un gcc -shared -c file.c, ça revient strictement au même que de le faire sans le -shared. Sauf qu'en pratique j'ai bel et bien une différence à l'execution.


 
Et quelle est la différence à l'exécution ?

n°1351400
FrigoAcide
Posté le 21-04-2006 à 16:50:22  profilanswer
 

En l'occurence, un SegFault. Mais je ne pourrai pas te dire quelle en est la raison, je n'intervient sur le projet que pour faire un portage, donc je n'ai pas étudié le source.
 
Par contre derrière, j'ai écris un simple programme de test, test.c, avec une fonction toute con. J'ai compilé avec et sans le flag -shared, et les 2 binaires obtenus étaient identiques.


---------------
Paléoanthropologie, évolution de l'espèce humaine et préhistoire
n°1351417
++fab
victime du syndrome IH
Posté le 21-04-2006 à 17:04:41  profilanswer
 

FrigoAcide a écrit :

En l'occurence, un SegFault. Mais je ne pourrai pas te dire quelle en est la raison, je n'intervient sur le projet que pour faire un portage, donc je n'ai pas étudié le source.


Que donne l'analyse post-mortem ?
 

FrigoAcide a écrit :

Par contre derrière, j'ai écris un simple programme de test, test.c, avec une fonction toute con. J'ai compilé avec et sans le flag -shared, et les 2 binaires obtenus étaient identiques.


Si tu parles bien des fichiers objets, c'est également ce que je m'attends à trouver d'après la documentation.

n°1351423
FrigoAcide
Posté le 21-04-2006 à 17:07:00  profilanswer
 

++fab a écrit :

Que donne l'analyse post-mortem ?


C'est-à-dire, tu veux quoi comme données ?
 
En fait c'est ma première "grosse" compil sous Linux (et je suis gâté), je viens plutôt du monde Windows.


---------------
Paléoanthropologie, évolution de l'espèce humaine et préhistoire
n°1351427
++fab
victime du syndrome IH
Posté le 21-04-2006 à 17:11:39  profilanswer
 

compiler en debug :  
$ gcc -g *.c
lancer et voir se vautrer l'appli :
$ ./a.out
analyse post-mortem à partir du core généré :
$ gdb a.out <nom_du_core>
--> bt
 
 

n°1351435
FrigoAcide
Posté le 21-04-2006 à 17:18:47  profilanswer
 

On avait justement ce problème, c'est que l'application ne plantait pas en mode débug. La raison : le plantage se manifeste lorsqu'il y a l'option -shared, mais seulement si on place également le flag d'optimisation -O2.
 
Or en débug on n'optimisait pas (-O0), du coup pas de plantage. Mais c'est vrai, c'est une bonne idée, je pourrai essayer de compiler en debug -O2, faire planter l'appli et tracer l'erreur.
 
Mais pas maintenant, lundi :o


---------------
Paléoanthropologie, évolution de l'espèce humaine et préhistoire

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Compilation gcc -shared -c *.c Puis archivage ?

 

Sujets relatifs
archivage de word dans la console admin.erreur lors de compilation, calcul mais pq ????
Erreur de compilationProbleme de compilation erreur, aider moi svp
PB d'execution de classe, erreur lors de compilation etudiant en actioerreur compilation
Problème de compilation d'une JSPErreur de compilation avec Eclipse
Problème lors de la compilationproblème de compilation avec eclipse
Plus de sujets relatifs à : Compilation gcc -shared -c *.c Puis archivage ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR