zlib 1.2.5, compilation sur Sun Solaris 10 X86 en 64 bits

Logo

Introduction

La librairie zlib est une librairie de compression multi plateforme bien plus efficace en compression et en mémoire que la méthode LZW, méthode utilisée par exemple par le binaire compress sous Unix.

Pour des raisons de performances et de sécurité, la version zlib 1.2.5 est fortement recommandée pour la construction de la librairie libpng, librairie graphique pour le format PNG (Portable Network Graphics). Pour vérifier la version de zlib déjà disponible sur la plateforme Sun Solaris 10 x86 et s’assurer qu’il s’agit de la version 1.2.5, consulter l’entête du fichier zlib.h situé dans le répertoire /usr/include.

% cat /usr/include/zlib.h | more
…
#define ZLIB_VERSION "1.2.3"
…

Ce n’est pas le cas ici. La compilation de la version 1.2.5 de la librairie zlib doit être réalisée.

La compilation de la version 1.2.5 de la librairie zlib en 64 bits avec SunStudio 12.1 sur une plateforme Solaris 10 x86 64 bits fait l’objet d’un article car la compilation présente des particularités : option pour le mode 64 bits et délocalisation de l’installation en dehors des répertoires systèmes /usr. Pour plus d’informations sur l’installation des compilateurs SunStudio 12.1 : Installation de Sun Studio 12 sur Sun Solaris 10 X86 pour les compilations.

Téléchargement et préparation de l’environnement

Téléchargement

zlib 1.2.5 est disponible en téléchargement sous la forme d’une archive compressée (zlib-1.2.5.tar.gz) à cette adresse : zlib 1.2.5 > Sourceforge Download.

L’archive compressée zlib-1.2.5.tar.gz est transférée avec ftp sur la machine cible dans le répertoire /Software/tools/temp puis décompressée et désarchivée avec les utilitaires gunzip et tar :

% cd /Software/tools/temp
% gunzip -c zlib-1.2.5.tar.gz | tar xvf -

Le code source est alors désarchivé avec la commande tar dans le sous répertoire ./zlib-1.2.5.

Préparation de l’environnement pour la compilation de zlib 1.2.5 avec SunStudio 64 bits

La variable $PATH est mise à jour avant la compilation pour référencer /usr/ccs/bin, répertoire qui contient les binaire ld et ar, indispensables pour la génération des librairies dynamiques et archives.

% PATH=/usr/ccs/bin:$PATH
% export PATH

Si les liens de SunStudio n’ont pas été installés dans /usr/bin lors de l’installation, la variable $PATH doit référencer également le répertoire <répertoire de sunstudio 12.1>/bin pour trouver les compilateurs.

% PATH=/opt/sunstudio12.1/bin:$PATH
% export PATH

Comme il s’agit d’une compilation en 64 bits, la variable d’environnement $CFLAGS est créée et mise à jour à -m64 :

% CFLAGS=-m64
% export CFLAGS

Un autre flag doit être ajouté dans la variable $CFLAGS pour les plateformes Solaris AMD/Intel 64 bits comme c’est le cas ici : -fPIC

% CFLAGS="-fPIC $CFLAGS"
% export CFLAGS

L’option PIC est utilisée pour les librairies partagées et correspond à l’abbréviation "Position Independant Code" : selon où réside la mémoire (32 bits ou 64 bits), le code approprié est exécuté grâce à cette option de compilation -fPIC. Sans cette option, les tests avec "make test" échouent avec le message "relocation error", message qui indique que ce sont les fonctions 32 bits qui sont exécutées dans la librairie :

% make test
          hello world
zlib version 1.2.5 = 0x1250, compile flags = 0xa9
uncompress(): hello, hello!
gzread(): hello, hello!
gzgets() after gzseek:  hello!
inflate(): hello, hello!
large_inflate(): OK
after inflateSync(): hello, hello!
inflate with dictionary: hello, hello!
                *** zlib test OK ***
ld.so.1: minigzipsh: fatal: relocation error: R_AMD64_32: 
file /Software/tools/temp/zlib-1.2.5/libz.so.1.2.5: symbol (unknown): 
value 0xfffffd7fff385dd8 does not fit
Killed
                *** zlib shared test FAILED ***
ld.so.1: minigzipsh: fatal: relocation error: R_AMD64_32: 
file /Software/tools/temp/zlib-1.2.5/libz.so.1.2.5: symbol (unknown): 
value 0xfffffd7fff385dd8 does not fit
*** Error code 255
The following command caused the error:
LD_LIBRARY_PATH=`pwd`:; export LD_LIBRARY_PATH; \
LD_LIBRARYN32_PATH=`pwd`: ; export LD_LIBRARYN32_PATH; \
DYLD_LIBRARY_PATH=`pwd`: ; export DYLD_LIBRARY_PATH; \
SHLIB_PATH=`pwd`: ; export SHLIB_PATH; \
if echo hello world | ./minigzipsh | ./minigzipsh -d && ./examplesh; then \
  echo '                *** zlib shared test OK ***'; \
else \
  echo '                *** zlib shared test FAILED ***'; false; \
fi
make: Fatal error: Command failed for target `testshared'

Avec l’option -fPIC dans la variable $CFLAGS, ce sont bien les fonctions 64 bits qui sont exécutées

% make test
          zlib version 1.2.5 = 0x1250, compile flags = 0xa9
uncompress(): hello, hello!
gzread(): hello, hello!
gzgets() after gzseek:  hello!
inflate(): hello, hello!
large_inflate(): OK
after inflateSync(): hello, hello!
inflate with dictionary: hello, hello!
                *** zlib 64-bit test OK ***

Configuration, compilation et installation

Une fois l’environnement préparé (variables $PATH, $CFLAGS), la configuration de la compilation peut être déclenchée avec le script configure.

L’option --help renvoie les options de configuration, options très simples pour zlib.

% cd /Software/tools/temp/zlib-1.2.5

% ./configure --help

usage:
  configure [--zprefix] [--prefix=PREFIX]  [--eprefix=EXPREFIX]
    [--static] [--64] [--libdir=LIBDIR] [--sharedlibdir=LIBDIR]
    [--includedir=INCLUDEDIR]

L’option --64 force la compilation en 64 bits et l’option --prefix est spécifiée ici afin de délocaliser l’installation de zlib 1.2.5 en dehors des répertoires systèmes /usr. L’installation est réalisée dans le répertoire /Software/tools/misc : --prefix=/Software/tools/misc (DIR).

La ligne de configuration de la compilation est donc la suivante dans cet exemple pratique :

% cd /Software/tools/temp/zlib-1.2.5

% ./configure --prefix=/Software/tools/misc --64

L’environnement étant bien préparé (variables $PATH, $CFLAGS), la configuration se déroule sans problème.

La compilation et l’installation de zlib 1.2.5 sont réalisées avec les commandes make et make install qui s’exécutent également sans problème. La commande "make test" permet de vérifier que les fonctions 32 bits ne sont pas chargées et appelées par défaut grâce à l’option -fPIC spécifiée à la compilation :

% cd /Software/tools/temp/zlib-1.2.5
% make
% make test
% make install

La compilation génère dans le répertoire DIR/lib la librairie archive statique libz.a et la librairie dynamique libz.so.1.2.5. Un lien symbolique libz.so pointe sur la librairie libz.so.1.2.5.

2 fichiers d’entête zlib.h et zconf.h sont générés dans le répertoire DIR/include. La version 1.2.5 est mentionnée dans le fichier d’entête zlib.h :

/Software/tools/misc/include/zlib.h
#define ZLIB_VERSION "1.2.5"

À la compilation de libpng par exemple, vérifier que la compilation utilise zlib.h version 1.2.5 et libz.so.1.2.5.