[TECH] Re: se lier statiquement avec une librarie dynamique

2008-09-27 Par sujet philippe lhardy
Je n'ai pas de solution mais une autre possiblité est juste de linker en 
dynamique avec un rpath pour indiquer ou trouver la librairie dynamique 
et la fournir à côté de l'exécutable dans l'environement chrooté.


Lien en angalis (désolé )
http://www.cs.indiana.edu/~welu/notes/node11.html

g++ -o main main.o -lfoo -L./ -Wl,-rpath=`pwd`

Mes 2 cents.

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 ***



Re: se lier statiquement avec une librarie dynamique

2008-09-25 Par sujet Benoit Peccatte
On Thursday 25 September 2008 21:51:38 MALET Jean-Luc wrote:
> Benoit Peccatte wrote:
> > Si le contenu change car il est lui même lié statiquement. De plus il
> > est en général stripé, c'est à dire qu'un certain nombre de symboles
> > ont disparu.
>
> ben déjà s'il est strippé et lié statiquement (enfin pas tout car si tu
> oublie de mettre les bonnes libs sur ta ligne de link... tu auras un
> zoli message disant "unresolved symbols") il a moins d'infos que la .so
> tu es d'accord? donc rien n'empêcherai le linker au moment du link de

Non, c'est le .so qui a moins d'infos. C'est lui qui est stripé et lié 
statiquement (aux .o du source s'entend). Et sinon oui il reste les 
information sur les fonctions publiques nécessaires à la liaison et non je ne 
sais pas pourquoi gcc ne sait pas faire statiquemnt ce qu'il fait 
dynamiquement. 

> faire la résolution des symbols d'ailleurs je me demande ce que cela
> fait si tu n'utilise pas -l mais que tu fais un g++ mon.cpp -o
> monprog /usr/lib/lib.so... /usr/lib/lib.so est un elf comme
> les .o je testerai lorsque j'aurais un peu de temps

Ça lie dinamiquement le .so


> > Oui oui, l'outil prelink qui fait ça est connu pour accélérer le
> > chargement de openoffice.
>
> prelink? humm j'avais perdu le nom... serait amusant d'avoir un outil de
> type full linkage qui prendrait un executable dynamique, les libs
> dynamiques et hop ferait la résolution de noms pour tout mettre dans un
> seul binaire...

Tant qu'on n'arrive pas a extraire une versionstatique ...
Bon je me suis documenté, je n'ai pas trouvé de moyen de l'extraire, et la 
mailing-list bsd dit que ce n'est pas possible. Parmi les outils les plus 
probables : nm, ld, objcopy, readelf


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 ***


Re: se lier statiquement avec une librarie dynamique

2008-09-25 Par sujet MALET Jean-Luc

Benoit Peccatte wrote:


On Wednesday 24 September 2008 18:37:05 jean-luc malet wrote:

> 2008/9/24 Benoit Peccatte <[EMAIL PROTECTED]>

> > 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



Si le contenu change car il est lui même lié statiquement. De plus il 
est en général stripé, c'est à dire qu'un certain nombre de symboles 
ont disparu.


ben déjà s'il est strippé et lié statiquement (enfin pas tout car si tu 
oublie de mettre les bonnes libs sur ta ligne de link... tu auras un 
zoli message disant "unresolved symbols") il a moins d'infos que la .so 
tu es d'accord? donc rien n'empêcherai le linker au moment du link de 
faire la résolution des symbols d'ailleurs je me demande ce que cela 
fait si tu n'utilise pas -l mais que tu fais un g++ mon.cpp -o 
monprog /usr/lib/lib.so... /usr/lib/lib.so est un elf comme 
les .o je testerai lorsque j'aurais un peu de temps


> > 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.



Homme de peu de foi, tu n'as même pas essayé. C'est le compilateur qui 
appelle le linker et c'est lui qui choisit les paramètres à lui passer 
(comme parexemple d'utiliser la libc que tu ne demande pas). Le fait 
de lui passer -static va entre autre lui dire de ne pas charger les 
bibliothèques qui ne fonctionnent qu'avec du chargement dynamique 
comme c'est le cas pour libgcc_s.so justement.


Après rien ne t'empêche d'appeler toi-même le linker avec tous les 
paramètres pour mieux en maitriser le processus.


hummm je m'incline, un petit coup de g++ -v -static m'indique que 
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.1/crtend.o 
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.1/../../../../lib64/crtn.o sont 
fournis au lieu d'une lib en .a va savoir pourquoi ils préfèrent 
avoir des objets plutot qu'une lib statique

ok j'admets mon peu de foi ;)

> > > 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

S'il ne te fournit qu'un .so c'est qu'il ne t'as pas fourni un kit de 
développemnt complet et c'est son choix, et c'est toi qui l'a choisi.


> 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)

Oui oui, l'outil prelink qui fait ça est connu pour accélérer le 
chargement de openoffice.




prelink? humm j'avais perdu le nom... 

Re: se lier statiquement avec une librarie dynamique

2008-09-24 Par sujet Benoit Peccatte
On Wednesday 24 September 2008 18:37:05 jean-luc malet wrote:
> 2008/9/24 Benoit Peccatte <[EMAIL PROTECTED]>
> > 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

Si le contenu change car il est lui même lié statiquement. De plus il est en 
général stripé, c'est à dire qu'un certain nombre de symboles ont disparu.


> > 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.

Homme de peu de foi, tu n'as même pas essayé. C'est le compilateur qui appelle 
le linker et c'est lui qui choisit les paramètres à lui passer (comme 
parexemple d'utiliser la libc que tu ne demande pas). Le fait de lui passer -
static va entre autre lui dire de ne pas charger les bibliothèques qui ne 
fonctionnent qu'avec du chargement dynamique comme c'est le cas pour 
libgcc_s.so justement.
Après rien ne t'empêche d'appeler toi-même le linker avec tous les paramètres 
pour mieux en maitriser le processus. 


> > > 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

S'il ne te fournit qu'un .so c'est qu'il ne t'as pas fourni un kit de 
développemnt complet et c'est son choix, et c'est toi qui l'a choisi.

> 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)

Oui oui, l'outil prelink qui fait ça est connu pour accélérer le chargement de 
openoffice.


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 ***


Re: se lier statiquement avec une librarie dynamique

2008-09-24 Par sujet jean-luc malet
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 ***


Re: se lier statiquement avec une librarie dynamique

2008-09-24 Par sujet jean-luc malet
On Wed, Sep 24, 2008 at 5:22 PM, <[EMAIL PROTECTED]> wrote:

> Salut
>
> > 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
>
> T'as essaye -static-libgcc ?
>
>
je pourais toujours essayer... mais mis à part recompiler le compiler je ne
risque pas d'avoir de résultat probant vu que seul le .so est présent sur le
système

-- 
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 ***


Re: se lier statiquement avec une librarie dynamique

2008-09-24 Par sujet kalou
Salut

> 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

T'as essaye -static-libgcc ?




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 ***



Re: se lier statiquement avec une librarie dynamique

2008-09-24 Par sujet Benoit Peccatte
Selon jean-luc malet <[EMAIL PROTECTED]>:

> j'ai un petit cgi é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.
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.

> 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.


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 ***