Oracle 11g R2, compilation du pilote ODBC avec unixODBC 2.3.0 sous Sun Solaris 10 X86

Logo

Introduction

Lors de la construction de la couche unixODBC 2.3.0 sous Solaris 10 x86 et d’un test de connexion ODBC vers Oracle 11g R2, mauvaise surprise : le pilote natif Oracle libsqora.so.11.1 pour ODBC dans $ORACLE_HOME/lib n’est pas présent.

L’option ODBC a bien été sélectionnée lors de la configuration de l’installation mais la librairie libsqora.so.11.1 n’a pas été construite car la couche unixODBC était manquante lors de l’installation. Pas de panique, il est encore possible de construire cette couche ODBC avec le compte unix oracle sans devoir exécuter à nouveau l’installeur Oracle Universal Installer ou réinstaller la distribution Oracle. Les étapes sont décrites dans cette note.

Il s’agit ici d’une distribution Oracle 11.2.0.2 64 bits installée dans le répertoire /Software/oracle/app/product/11.2.0 ($ORACLE_HOME) sur une plateforme Sun Solaris 10 x86. Dès maintenant la variable d’environnement $ORACLE_HOME est initialisée si ce n’est pas le cas :

% ORACLE_HOME=/Software/oracle/app/product/11.2.0
% export ORACLE_HOME

Pour plus d’informations sur la compilation d’unixODBC 2.3.0 avec SunStudio 12.1 : unixODBC 2.3.0, compilation et utilisation sous Sun Solaris 10 X86.

Pré-requis

Vérifier que l’option ODBC a bien été sélectionnée lors de l’installation avec Oracle Universal Installer.

Pour s’en assurer, le répertoire $ORACLE_HOME/odbc doit exister avec des fichiers make (*.mk) et des librairies archives (*.a) dans le répertoire $ORACLE_HOME/odbc/lib :

% cd $ORACLE_HOME/odbc/lib

% ls

ins_odbc.mk
env_odbc.mk
utility.a
sqoci.a
sqora.a

Si ce n’est pas le cas, l’option ODBC n’a pas été sélectionnée, relancer l’installation avec Oracle Universal Installer pour sélectionner le composant ODBC.

ins_odbc.mk est le fichier make pour construire la librairie libsqora.so.11.1 à partir notamment des librairies archives utility.a, sqoci.a et sqora.a générées à l’installation. unixODBC n’existait pas lors de l’installation, les commandes make dans ins_odbc.mk sont tombées en erreur lors de l’installation sans toutefois avorter l’installation d’Oracle 11g R2.

Construction de la librairie ODBC native Oracle libsqora.so.11.1

Si le répertoire /usr/ccs/bin n’est pas référencé dans la variable PATH, celui-ci y est ajouté afin d’appeler l’exécutable make qui s’y trouve :

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

Les librairies unixODBC sont référencées dans la variable LD_LIBRARY_PATH. Dans le contexte de cet article, unixODBC est installé dans le répertoire /Software/tools/unixodbc.

% LD_LIBRARY_PATH=/Software/tools/unixodbc/lib:$LD_LIBRARY_PATH
% export LD_LIBRARY_PATH

Les commandes make sont alors lancées en donnant en paramètre le fichier ins_odbc.mk et isqora:

% cd $ORACLE_HOME/odbc/lib

% make -f ns_odbc.mk isqora

 - Linking sqora

rm -f /Software/oracle/app/product/11.2.0/odbc/lib/libsqora.so.11.1
/usr/ccs/bin/ld -o  /Software/oracle/app/product/11.2.0/odbc/lib/libsqora.so.11.1
 -L/Software/oracle/app/product/11.2.0/odbc/lib/ 
 -L/Software/oracle/app/product/11.2.0/lib/ -dy   
 `cat /Software/oracle/app/product/11.2.0/lib/sysliblist`  
 -lm  -64 -G -z textoff 
 -h libsqora.so.11.1
 -zinitarray=initSqora -zfiniarray=finiSqora  
 -z allextract /Software/oracle/app/product/11.2.0/odbc/lib/sqora.a
 /Software/oracle/app/product/11.2.0/odbc/lib/sqoci.a
 /Software/oracle/app/product/11.2.0/odbc/lib/utility.a  
 -z defaultextract -R /Software/oracle/app/product/11.2.0/lib  
 -L /Software/oracle/app/product/11.2.0/lib 
 -L /Software/oracle/app/product/11.2.0/odbc/public/osds/unixODBC/lib  
 -lclntsh /Software/oracle/app/product/11.2.0/lib/libunls11.a -ldl 
 -lodbcinst
  /Software/oracle/app/product/11.2.0/lib/libcore11.a   -ldl

L’argument -64 indique bien une compilation en 64 bits de la librairie libsqora.so.11.1, par ailleurs le "linking" est réalisée avec la librairie odbcinst. Cette librairie est fournie par unixODBC, c’est pourquoi la variable LD_LIBRARY_PATH référence /Software/tools/unixodbc/lib. Si la librairie odbcinst n’est pas trouvée :

ld: fatal: library -lodbcinst: not found
ld: fatal: File processing errors. No output written to
/Software/oracle/app/product/11.2.0/odbc/lib/libsqora.so.11.1
*** Error code 1
make: Fatal error: Command failed for target
 `/Software/oracle/app/product/11.2.0/odbc/lib/libsqora.so.11.1'

C’est exactement ce qui s’est produit lors de l’installation, unixODBC n’existant pas.

Installation de la librairie ODBC native Oracle libsqora.so.11.1

La commande file indique bien qu’il s’agit d’une librairie dynamique en 64 bits :

% cd $ORACLE_HOME/odbc/lib

% file libsqora.so.11.1

libsqora.so.11.1:       ELF 64-bit LSB dynamic lib AMD64 Version 1,
dynamically linked, not stripped, no debugging information available

Elle doit être ensuite installée dans le répertoire $ORACLE_HOME/lib.

cp -f libsqora.so.11.1 $ORACLE_HOME/lib

Vérifier à cette étape les permissions sur la librairie libsqora.so.11.1, elle doit être en lecture pour tout le monde (user, group, other).

La commande ldd indique bien que cette librairie libsqora.so.11.1 est dépendante de la librairie unixODBC libodbcinst.so.1 :

% ldd libsqora.so.11.1
 ...
 libm.so.2 =>     /lib/64/libm.so.2
 libclntsh.so.11.1 =>     ./libclntsh.so.11.1
 libodbcinst.so.1 =>  /Software/tools/unixodbc/lib/libodbcinst.so.1
 libmp.so.2 =>    /lib/64/libmp.so.2
 ...

Test d’utilisation du pilote ODBC Oracle 11g avec unixODBC

Pour tester le pilote ODBC Oracle 11g avec unixODBC : Oracle 11g R2, utilisation du pilote ODBC avec unixODBC 2.3.0 sous Sun Solaris 10 X86