OVH Cloud OVH Cloud

Red Hat et symbole "__ctype_b"

7 réponses
Avatar
Seb
Bonjour,

J'utilise une version Red Hat 9 et j'utilisais une librairie qui
fonctionnait avec la version 7. Lorsque je l'utilise maintenant, au moment
de l'édition de liens il "manque" le symbole "__ctype_b".

Je me suis renseigné aupres de "bugzilla" et effectivement ce problème est
connu. Si j'ai bien compris ce n'est pas une anomalie mais une évolution.
Or, en ce qui me concerne cela m'empeche d'utiliser ma librairie (je ne
dispose pas des sources).

Auriez-vous déjà eu ce problème, et si oui comment l'avez-vous résolu.

Merci.

Sébastien

7 réponses

Avatar
george
"Seb" , dans le message <br43tq$qui$, a
écrit :
librairie


Le mot que tu cherches est « bibliothèque ».

Or, en ce qui me concerne cela m'empeche d'utiliser ma librairie (je ne
dispose pas des sources).


C'est bête, hein, les programmes propriétaires ?

Auriez-vous déjà eu ce problème, et si oui comment l'avez-vous résolu.


Il ne devrait pas y avoir de problème de compatibilité avec la glibc,
grace au ELF symbol versionning. J'ai ici une glibc 2.3.2, et elle a
bien le symbole __ctype_b estampillé GLIBC_2.0. Un examen de celle de la
RedHat montre le même symbole, mais avec des attributs légèrement
différents, d'une manière que je ne sais pas lire. Tu peux essayer de
recompiler une glibc, l'installer dans un coin et jouer avec
LD_LIBRARY_PATH.

Avatar
Seb
"Nicolas George" a écrit dans le message news:
br4ljq$2pu7$
"Seb" , dans le message <br43tq$qui$, a
librairie


Le mot que tu cherches est « bibliothèque ».



Sans commentaire ...


Or, en ce qui me concerne cela m'empeche d'utiliser ma librairie (je
ne dispose pas des sources).


C'est bête, hein, les programmes propriétaires ?


A qui le dis tu ! :(


Auriez-vous déjà eu ce problème, et si oui comment l'avez-vous
résolu.


Il ne devrait pas y avoir de problème de compatibilité avec la glibc,
grace au ELF symbol versionning. J'ai ici une glibc 2.3.2, et elle a
bien le symbole __ctype_b estampillé GLIBC_2.0. Un examen de celle de
la RedHat montre le même symbole, mais avec des attributs légèrement
différents, d'une manière que je ne sais pas lire. Tu peux essayer de
recompiler une glibc, l'installer dans un coin et jouer avec
LD_LIBRARY_PATH.


J'ai regardé bugzilla, et il semble que red hat ait changé "__ctype_b" pour
"__ctype_b_loc" (j'ai pas trop compris les raisons). Je ne sais pas trop ce
qu'est ELF, mais au vue des anomalies qui ont été postées par rapport à ce
symbole, il est clair que Red Hat a renommé ce symbole.

Ma libr... heu bibliothèque ;) est une glibc 2.3.2-11 (mise à jour vers
2.3.2-27) et je ne dispose pas de ce symbole (sauf si je m'y prend mal pour
le rechercher. Peut etre as-tu lu "_ctype_b_loc" lorsque tu dis "avec des
attributs différents".

Je vais essayer de recompiler ma glibc : si tu pouvais m'indiquer comment
procéder se serait sympa, sinon Mr Google;

Merci Sébastien


Avatar
george
"Seb" , dans le message <br4n11$80t$, a
écrit :
J'ai regardé bugzilla, et il semble que red hat ait changé "__ctype_b" pour
"__ctype_b_loc" (j'ai pas trop compris les raisons). Je ne sais pas trop ce
qu'est ELF,


ELF est la norme des exécutables sous beaucoup d'Unix, dont Linux,
Solaris, FreeBSD et depuis peu OpenBSD. C'est bien le même format. Si je
récupère sur un FreeBSD la libc (include et .so), que j'utilise un gcc
natif Linux avec les bonnes options, je peux obtenir un binaire FreeBSD
qui marchera parfaitement. Tant que c'est compilé pour le même
processeur évidemment.

Le symbol versionning, c'est la possibilité de mettre plusieurs fois le
même symbole, avec des versions différentes, dans la bibliothèque.

mais au vue des anomalies qui ont été postées par rapport à ce
symbole, il est clair que Red Hat a renommé ce symbole.


Voici ce que j'obtiens sur une glibc RedHat 2.3.2-11 fraîchement
téléchargée :

/tmp $ objdump -T lib/libc-2.3.2.so | grep __ctype_b
00020eec g DF .text 0000006a GLIBC_2.3 __ctype_b_loc
0011f938 g DO .data 00000004 (GLIBC_2.0) __ctype_b

Sur ma Debian Sarge (glibc 2.3.2 aussi), j'ai ceci :

~ $ objdump -T /lib/libc-2.3.2.so | grep __ctype_b
00128498 g DO .data 00000004 GLIBC_2.0 __ctype_b
00023650 g DF .text 00000071 GLIBC_2.3 __ctype_b_loc

Donc il y a bien un nouveau symbole __ctype_b_loc, mais l'ancien,
__ctype_b, est toujours là, mais pas de la même manière entre les deux.

Je vais essayer de recompiler ma glibc : si tu pouvais m'indiquer comment
procéder se serait sympa, sinon Mr Google;


Il y a plus simple, en fait : récupérer la libc d'une autre distrib. Si
tu veux celle que j'ai, par exemple :

mkdir /tmp/libc6
cd /tmp/libc6
wget ftp://ftp.fr.debian.org/debian/pool/main/g/glibc/libc6_2.3.2.ds1-10_i386.deb
ar x libc6_2.3.2.ds1-10_i386.deb
tar xfz data.tar.gz
Tu te retrouves avec un /tmp/libc6/lib/ qui la contient, et qui ne fait
de mal à personne. Tu peux alors dire aux programme de l'utiliser,
ponctuellement, avec

export LD_LIBRARY_PATH=/tmp/libc6/lib

Note : tout ceci est fait dans le vide, il se peut que j'aie oublié un
niveau de répertoire ici ou là.

Au fait, quel est le débat ?

Avatar
Seb
"Nicolas George" a écrit dans le message news:
br4o91$de2$
"Seb" , dans le message <br4n11$80t$, a
J'ai regardé bugzilla, et il semble que red hat ait changé
"__ctype_b" pour "__ctype_b_loc" (j'ai pas trop compris les
raisons). Je ne sais pas trop ce qu'est ELF,


ELF est la norme des exécutables sous beaucoup d'Unix, dont Linux,
Solaris, FreeBSD et depuis peu OpenBSD. C'est bien le même format. Si
je récupère sur un FreeBSD la libc (include et .so), que j'utilise un
gcc
natif Linux avec les bonnes options, je peux obtenir un binaire
FreeBSD
qui marchera parfaitement. Tant que c'est compilé pour le même
processeur évidemment.

Le symbol versionning, c'est la possibilité de mettre plusieurs fois
le
même symbole, avec des versions différentes, dans la bibliothèque.



Merci (c'était pour ma culture générale).

mais au vue des anomalies qui ont été postées par rapport à ce
symbole, il est clair que Red Hat a renommé ce symbole.


Voici ce que j'obtiens sur une glibc RedHat 2.3.2-11 fraîchement
téléchargée :

/tmp $ objdump -T lib/libc-2.3.2.so | grep
__ctype_b 00020eec g DF .text 0000006a GLIBC_2.3 __ctype_b_loc
0011f938 g DO .data 00000004 (GLIBC_2.0) __ctype_b

Sur ma Debian Sarge (glibc 2.3.2 aussi), j'ai ceci :

~ $ objdump -T /lib/libc-2.3.2.so | grep __ctype_b
00128498 g DO .data 00000004 GLIBC_2.0 __ctype_b
00023650 g DF .text 00000071 GLIBC_2.3 __ctype_b_loc

Donc il y a bien un nouveau symbole __ctype_b_loc, mais l'ancien,
__ctype_b, est toujours là, mais pas de la même manière entre les
deux.



Là je ne comprend plus : j'ai avec objdump (que je n'avais pas utilisé) la
meme chose que toi. Cependant mon édition de liens ne fonctionne toujours
pas.


Je vais essayer de recompiler ma glibc : si tu pouvais m'indiquer
comment procéder se serait sympa, sinon Mr Google;


Il y a plus simple, en fait : récupérer la libc d'une autre distrib.


[...]

Finalement non parceque j'ai la même chose que toi. Aurais-tu une idée
pourquoi ma bibliothèque ne peut être liée (il s'agit d'une librairie IBM).


Au fait, quel est le débat ?


Peut-être me suis-je alarmé au vue des recherches que j'ai pu faire sur
google, cependant, même si ce symbole est présent. Voici le résultat de ma
compilation, c'est peut-être plus parlant :

/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../libisam.a(osctype.o)(.text
+0x129): In function `ldctypearr':
: référence indéfinie vers « __ctype_b »
/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../libisam.a(osctype.o)(.text
+0x1c3): In function `ldctypearr':
: référence indéfinie vers « __ctype_tolower »
/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../libisam.a(osctype.o)(.text
+0x1ea): In function `ldctypearr':
: référence indéfinie vers « __ctype_toupper »
/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../libisam.a(glsutill.o)(.tex
t+0xe0c): In function `_gl_skip_whitespace':
: référence indéfinie vers « __ctype_b »
/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../libisam.a(glsutill.o)(.tex
t+0xf0c): In function `_gl_get_int':
: référence indéfinie vers « __ctype_b »
/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../libisam.a(glsutill.o)(.tex
t+0xf71): In function `_gl_get_int':
: référence indéfinie vers « __ctype_b »
/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../libisam.a(glsutill.o)(.tex
t+0xfcc): In function `_gl_get_int':
: référence indéfinie vers « __ctype_b »
/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../libisam.a(glsutill.o)(.tex
t+0x103f): In function `_gl_get_dbl':


Sébastien


Avatar
Miod Vallat
ELF est la norme des exécutables sous beaucoup d'Unix, dont Linux,


La «norme», tout de suite les grands mots... C'est juste un format de
binaire mal conçu, hein.

Solaris, FreeBSD et depuis peu OpenBSD. C'est bien le même format. Si je


Depuis peu ? Ça dépend des plate-formes (-:

récupère sur un FreeBSD la libc (include et .so), que j'utilise un gcc
natif Linux avec les bonnes options, je peux obtenir un binaire FreeBSD
qui marchera parfaitement. Tant que c'est compilé pour le même
processeur évidemment.


Ça n'a rien à voir avec gcc, ça. gcc produit du code assembleur, et
c'est le couple as/ld qui se charge de le transformer en binaire. Avec
des binutils bien configurés, tu peux, à partir de la même sortie de
gcc, obtenir des binaires a.out, ELF, ou que sais-je encore.

Le symbol versionning, c'est la possibilité de mettre plusieurs fois le
même symbole, avec des versions différentes, dans la bibliothèque.


Et ça, c'est une extension à ELF qui n'est pas nécessairement supportée
partout (en fait, nulle part ailleurs que sous Linux et Hurd, pour
autant que je sache...)

Au fait, quel est le débat ?


Il n'y en a pas, alors je me suis dit que je pouvais
ronchonner^Wintervenir.

Avatar
george
Miod Vallat , dans le message <br4qdg$2020$, a
écrit :
Depuis peu ? Ça dépend des plate-formes (-:


Effectivement. C'est tout nouveau pour ix86, mais plus ancien pour
d'autre.

Ça n'a rien à voir avec gcc,


Bien sûr. C'est juste un exemple.

Et ça, c'est une extension à ELF qui n'est pas nécessairement supportée
partout (en fait, nulle part ailleurs que sous Linux et Hurd, pour
autant que je sache...)


Il me semble bien que Solaris l'utilise également.

Avatar
Michel BILLAUD
(Nicolas George) writes:

"Seb" , dans le message <br4n11$80t$, a
écrit :
J'ai regardé bugzilla, et il semble que red hat ait changé "__ctype_b" pour
"__ctype_b_loc" (j'ai pas trop compris les raisons). Je ne sais pas trop ce
qu'est ELF,


ELF est la norme des exécutables sous beaucoup d'Unix, dont Linux,
Solaris, FreeBSD et depuis peu OpenBSD. C'est bien le même format.


Ca existait dans Sys V ATT. Preuve que Linux a pompé sur SCO.

MB
--
Michel BILLAUD
LABRI-Université Bordeaux I tel 05 4000 6922 / 05 5684 5792
351, cours de la Libération http://www.labri.fr/~billaud
33405 Talence (FRANCE)