ld et Solaris

Le
JKB
Bonjour à tous,

Un petit problème avec ld version Solaris 10. J'ai une bibliothèque
qui réutilise des symboles du programme qui la charge. Avec GNU ld,
il suffit de rajouter -rdynamic lors de l'édtion des liens du
programme appelant et tout se passe bien. Je n'arrive
pas à faire la même chose sous Solaris. La bibliothèque est bien
chargée, mais elle ne voit pas les symboles de l'exécutable
appelant. Je viens d'essayer sans succès un tas d'options de ld. Une
idée ?

Merci,

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
none
Le #17380801
Une idee en l'air: ajouter -Kpic ou son equivalent lors de la compilation.

Gilles

JKB wrote:
Bonjour à tous,

Un petit problème avec ld version Solaris 10. J'ai une bibliothèque
qui réutilise des symboles du programme qui la charge. Avec GNU ld,
il suffit de rajouter -rdynamic lors de l'édtion des liens du
programme appelant et tout se passe bien. Je n'arrive
pas à faire la même chose sous Solaris. La bibliothèque est bien
chargée, mais elle ne voit pas les symboles de l'exécutable
appelant. Je viens d'essayer sans succès un tas d'options de ld. Une
idée ?

Merci,

JKB



JKB
Le #17380941
Le 30-09-2008, ? propos de
Re: ld et Solaris,
none ?crivait dans fr.comp.os.unix :
Une idee en l'air: ajouter -Kpic ou son equivalent lors de la compilation.



J'oubliais, j'utilise gcc-4.3...

JKB

--
Le cerveau, c'est un v
none
Le #17381221
Avec gcc, l'option est -fpic ou -fPIC...
Mais ceci dit, je ne sais pas quel est le comportement par défaut de
dlopen sous Solaris en ce qui concerne la visibilité des symbole
globaux. Les bibliothèques dynamiques sont elles ouvertes avec
l'équivalent de l'option RTLD_GLOBAL? Y a il une variable
d'environnement à positionner pour obtenir ce comportement ?

Gilles


JKB wrote:
Le 30-09-2008, ? propos de
Re: ld et Solaris,
none ?crivait dans fr.comp.os.unix :
Une idee en l'air: ajouter -Kpic ou son equivalent lors de la compilation.



J'oubliais, j'utilise gcc-4.3...

JKB



JKB
Le #17381411
Le 30-09-2008, ? propos de
Re: ld et Solaris,
none ?crivait dans fr.comp.os.unix :
Avec gcc, l'option est -fpic ou -fPIC...
Mais ceci dit, je ne sais pas quel est le comportement par défaut de
dlopen sous Solaris en ce qui concerne la visibilité des symbole
globaux. Les bibliothèques dynamiques sont elles ouvertes avec
l'équivalent de l'option RTLD_GLOBAL? Y a il une variable
d'environnement à positionner pour obtenir ce comportement ?



J'utilise d
none
Le #17381571
Et bien c'est exactement le comportement attendu alors. RTLD_LOCAL évite
que les symboles globaux soient vus par la bibliothèque dynamique.
Si tu souhaites qu'ils soient vus, utilises RTLD_GLOBAL à la place, et
link avec -rdynamic....

Gilles

JKB wrote:
Le 30-09-2008, ? propos de
Re: ld et Solaris,
none ?crivait dans fr.comp.os.unix :
Avec gcc, l'option est -fpic ou -fPIC...
Mais ceci dit, je ne sais pas quel est le comportement par défaut de
dlopen sous Solaris en ce qui concerne la visibilité des symbole
globaux. Les bibliothèques dynamiques sont elles ouvertes avec
l'équivalent de l'option RTLD_GLOBAL? Y a il une variable
d'environnement à positionner pour obtenir ce comportement ?



J'utilise d�j� -fPIC pour la compilation et l'�dition des liens
des biblioth�ques.

La biblioth�que en question est ouverte par un truc du genre :

if ((descripteur_bibliotheque = dlopen(bibliotheque,
RTLD_NOW | RTLD_LOCAL)) == NULL)
...

Cela fonctionne parfaitement sous FreeBSD et sous Linux. � noter, je
ne veux pas qu'un symbole d'une biblioth�que puisse r�soudre un
symbole d'une autre biblioth�que, seulement qu'une biblioth�que
puisse utiliser un symbole export� par le programme qui l'ouvre (et
qui ne se trouve pas dans une autre biblioth�que).

Cordialement,

JKB



JKB
Le #17381831
Le 30-09-2008, ? propos de
Re: ld et Solaris,
none ?crivait dans fr.comp.os.unix :
Et bien c'est exactement le comportement attendu alors. RTLD_LOCAL évite
que les symboles globaux soient vus par la bibliothèque dynamique.
Si tu souhaites qu'ils soient vus, utilises RTLD_GLOBAL à la place, et
link avec -rdynamic....



Ce n'est pas ce que j'ai dans mon man :

RTLD_GLOBAL
Les symboles d
none
Le #17382001
JKB wrote:
Le 30-09-2008, ? propos de
Re: ld et Solaris,
none ?crivait dans fr.comp.os.unix :
Et bien c'est exactement le comportement attendu alors. RTLD_LOCAL évite
que les symboles globaux soient vus par la bibliothèque dynamique.
Si tu souhaites qu'ils soient vus, utilises RTLD_GLOBAL à la place, et
link avec -rdynamic....



Ce n'est pas ce que j'ai dans mon man :

RTLD_GLOBAL
Les symboles d�finis par cette biblioth�que
seront disponibles pour la r�solution des symboles des
futurs chargements de biblioth�ques.

Je ne veux pas que les symboles de cette biblioth�que soient
utilisables pour la r�solution de symboles d'une autre biblioth�que.
C'est pour cela que j'ouvre l'objet avec un RTLD_LOCAL.

Fixons les id�es. Consid�rons que mon programme embarque en
lui-m�me (pas dans une biblioth�que partag�e) un truc qui s'appelle
instruction_sql(). Je veux que ma biblioth�que ait acc�s � ce
symbole (qui ne provient pas d'une biblioth�que partag�e mais du
programme lui-m�me). Par contre, si une biblioth�que externe exporte
un symbole toto(), je ne veux pas qu'une autre biblioth�que puisse
l'utiliser.



Ok, au temps pour moi. J'étais partit à fond sur la corrélation
RTLD_GLOBAL <-> rdynamic qui est parfois présente dans la man page de
dlopen, sans voir qu'à priori, les deux sont orthogonaux. Donc, je ne
sais pas comment résoudre ton problème... Peut-être l'utilisation de
RTLD_PARENT pourrait aider... cf
http://docs.sun.com/app/docs/doc/816-5168/dlopen-3c?a=view
Mais c'est pas top clair tout ça.

Gilles
JKB
Le #17381991
Le 30-09-2008, ? propos de
Re: ld et Solaris,
none ?crivait dans fr.comp.os.unix :
JKB wrote:
Le 30-09-2008, ? propos de
Re: ld et Solaris,
none ?crivait dans fr.comp.os.unix :
Et bien c'est exactement le comportement attendu alors. RTLD_LOCAL évite
que les symboles globaux soient vus par la bibliothèque dynamique.
Si tu souhaites qu'ils soient vus, utilises RTLD_GLOBAL à la place, et
link avec -rdynamic....



Ce n'est pas ce que j'ai dans mon man :

RTLD_GLOBAL
Les symboles d�finis par cette biblioth�que
seront disponibles pour la r�solution des symboles des
futurs chargements de biblioth�ques.

Je ne veux pas que les symboles de cette biblioth�que soient
utilisables pour la r�solution de symboles d'une autre biblioth�que.
C'est pour cela que j'ouvre l'objet avec un RTLD_LOCAL.

Fixons les id�es. Consid�rons que mon programme embarque en
lui-m�me (pas dans une biblioth�que partag�e) un truc qui s'appelle
instruction_sql(). Je veux que ma biblioth�que ait acc�s � ce
symbole (qui ne provient pas d'une biblioth�que partag�e mais du
programme lui-m�me). Par contre, si une biblioth�que externe exporte
un symbole toto(), je ne veux pas qu'une autre biblioth�que puisse
l'utiliser.



Ok, au temps pour moi. J'étais partit à fond sur la corrélation
RTLD_GLOBAL <-> rdynamic qui est parfois présente dans la man page de
dlopen, sans voir qu'à priori, les deux sont orthogonaux. Donc, je ne
sais pas comment résoudre ton problème... Peut-être l'utilisation de
RTLD_PARENT pourrait aider... cf
http://docs.sun.com/app/docs/doc/816-5168/dlopen-3c?a=view
Mais c'est pas top clair tout ça.



Je suis en train de me demander si le truc ne vient pas du fait que
gcc utilise par d
JKB
Le #17388461
Le 30-09-2008, ? propos de
ld et Solaris,
JKB ?crivait dans fr.comp.os.unix :
Bonjour à tous,

Un petit problème avec ld version Solaris 10. J'ai une bibliothèque
qui réutilise des symboles du programme qui la charge. Avec GNU ld,
il suffit de rajouter -rdynamic lors de l'édtion des liens du
programme appelant et tout se passe bien. Je n'arrive
pas à faire la même chose sous Solaris. La bibliothèque est bien
chargée, mais elle ne voit pas les symboles de l'exécutable
appelant. Je viens d'essayer sans succès un tas d'options de ld. Une
idée ?



Pour ceux que ça intéresse, voici la solution. Pour une raison
obscure, le LD de GNU utilisé par gcc ne comprends pas l'option
-rdynamic. Cette option passée au frontend appelle ld avec
-export-dynamic (et ne fait que ça). Donc en remplaçant la première,
par la seconde, ça fonctionne.

Bref, c'est plus un bug qu'autre chose...

Cordialement,

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Publicité
Poster une réponse
Anonyme