2008/9/24 Benoit Peccatte <[EMAIL PROTECTED]> > Selon jean-luc malet <[EMAIL PROTECTED]>: > > > j'ai un petit cgi Ã(c)crit en C++ qui marche bien en dynamique (donc sans > la > > prison de type chroot) > > je me suis dit "ben tu n'as qu'à le linker en static..." sitôt dit > sitôt > > fait... > > g++ mon.cpp -o mon.cgi -Wl,--static > > et là c'est le drame... la libgcc_s.so n'as pas de pendant en .a donc ld > se > > plaint de ne pas trouver -lgcc_s... bien. il cherche un .a? que ce > > passe-t-il si on fait un lien symbolique? ah maintenant il se plaint que > > c'est une librarie dynamique et pas une librarie statique.... > > Hé non car comme tu l'as dit plus haut, un .a n'est qu'une collection > d'objets > donc ça n'a pas le même format.
un format est un format... franchement lorsque le linker va ouvrir un .a (qui est une archive ar, donc pas loin d'un vulgaire zip) et rechercher dans la collection d'objets (elf qui plus est!) lequel correspond à l'appel de fonction, et lorsqu'il va ouvrir un elf qui est un jeu d'objets concaténés avec un header qui permet de savoir ce qui manque et où trouver quoi afin de faire la résolution des noms au runtime... pour moi c'est kiffkiff... pour tirer le résonnement à l'extrême, qu'est qui empêche le linker de faire la résolution qui est effectuée au runtime au linktime? s'il est capable de le faire au moment où cela doit s'executer, c'est alors faisable avant l'execution.... le conteneur change pas le contenu.... > > Sinon, tu obtiendra un bien meilleur résultat en disant au compilateur (et > pas > seulement au linker) que tu fais un exécutable statique, remplace > -Wl,--static > par --static. cela je ne le pense pas, car le compilateur n'en a rien à cirer avant le linktime du static. les objets créés sont tous relogeables et contiennent tous les symboles nécessaires à la résolution de nom (sinon aucun linkage avec aucune librairie voir aucun des objets généré n'est possible). Celui qui est en charge de mette tout ensemble c'est le linker, et pas le compilateur qui va générer les objets, le compilateur doit donc fournir des objets qui marchent quelque soit le linker utilisé après, à l'extrême on peu générer l'ensemble des .o (sans le --static) et après les lier avec ld --static et cela marche sans aucun pb, sauf qu'il semblerait que ld avec l'option --static n'ira chercher que les .a et vu que j'ai une lib uniquement en .so et pas en .a..... l'exemple typique c'est que pour faire un .so (librarie dynamique) il te suffit de compiler tes sources pour avoir une collection de .o que tu link après avec ld (et pas gcc) en utilisant des options tels que -Bdynamic et -soname. tu n'as pas besoin de compiler de nouveau pour faire le .a : tu fais un ar de tes .o et un ranlib (optionel sous linux) dessus le .a.... bref les même objets on servis pour faire la lib dynamique ou la lib static et les objets ont été compilé une seule fois avec un seul jeu d'option (en général un vulgaire gcc -C -o toto.o toto.c) > > > > je ne trouve nul pas les options à donner pour que le linker fasse le > > linkage avec la lib dynamique mais non pas au runtime (comportement d'une > > lib dynamique) mais au linktime... en gros qu'il fasse ce qu'il fait avec > > une librarie static ".a" mais avec une librarie dynamique ".so" > > Je ne saisis pas l'intérêt, il te faut simplement le .a lequel se trouve en > général dans le paquet -dev correspondant à la bibliothèque dynamique. Le > .a > sera alors intégralement dans l'exécutable et tu n'en auras plus besoin > ensuite. question... tu fais quoi lorsque le "vendeur" de la librairie ne fournis qu'un .so? de même si tu fais beaucoup de dev (ce qui est mon cas) tu te retrouves avec une pallanquée de .a qui sont en duplicata avec les .so... c'est de la perte de place alors que techniquement parlant faire la résolution de symboles en avance de phase (ie à la compilation et pas au run time) est tout à fait faisable (on peut même faire la résolution dynamique avant pour accélérer le charchement des exécutables) JLM -- KISS! (Keep It Simple, Stupid!) (garde le simple, imbécile!) "mais qu'est-ce que tu m'as pondu comme usine à gaz? fait des choses simples et qui marchent, espèce d'imbécile!" ----------------------------- "Si vous pensez que vous êtes trop petit pour changer quoique ce soit, essayez donc de dormir avec un moustique dans votre chambre." Betty Reese http://www.grainesdechangement.com/citations.htm Diffusez cette liste aupres de vos relations :) Linux Azur : http://linux-azur.org L'auteur du post est responsable de ses �crits ! *** Pas de message SMS, HTML ni de PJ SVP ***
