| 1 |
<?xml version="1.0" encoding="ISO-8859-15"?> |
|---|
| 2 |
<!-- Dernière modification |
|---|
| 3 |
le $Date$ |
|---|
| 4 |
par $Author$ |
|---|
| 5 |
révision $Revision$ --> |
|---|
| 6 |
<!-- SAS : 20070511, PG824 --> |
|---|
| 7 |
|
|---|
| 8 |
<sect2 id="dfunc"> |
|---|
| 9 |
<title id="dfunc-title">Compiler et lier des fonctions chargées dynamiquement</title> |
|---|
| 10 |
|
|---|
| 11 |
<para> |
|---|
| 12 |
Avant de pouvoir être utilisées dans <productname>PostgreSQL</productname>, |
|---|
| 13 |
les fonctions d'extension écrites en C doivent être compilées et liées |
|---|
| 14 |
d'une certaine façon, ceci afin de produire un fichier |
|---|
| 15 |
dynamiquement chargeable par le serveur. Pour être plus précis, une |
|---|
| 16 |
<firstterm>bibliothèque partagée</firstterm> doit être créée. |
|---|
| 17 |
<indexterm><primary>bibliothèque partagée</primary></indexterm> |
|---|
| 18 |
</para> |
|---|
| 19 |
|
|---|
| 20 |
<para> |
|---|
| 21 |
Pour obtenir plus d'informations que celles contenues dans cette section, |
|---|
| 22 |
il faut se référer à la documentation du système d'exploitation, en |
|---|
| 23 |
particulier les pages traitant du compilateur C, de <command>cc</command> et |
|---|
| 24 |
de l'éditeur de lien, <command>ld</command>. Par ailleurs, le code |
|---|
| 25 |
source de <productname>PostgreSQL</productname> contient de nombreux exemples |
|---|
| 26 |
fonctionnels dans le répertoire <filename>contrib</filename>. |
|---|
| 27 |
Néanmoins, ces exemples entraînent la création de modules |
|---|
| 28 |
qui dépendent de la disponibilité du code source de |
|---|
| 29 |
<productname>PostgreSQL</productname>. |
|---|
| 30 |
</para> |
|---|
| 31 |
|
|---|
| 32 |
<para> |
|---|
| 33 |
La création de bibliothèques partagées est un |
|---|
| 34 |
processus analogue à celui utilisé pour lier des exécutables : |
|---|
| 35 |
les fichiers sources sont d'abord compilés en fichiers objets puis sont liées ensemble. |
|---|
| 36 |
Les fichiers objets doivent être compilés sous la forme de <firstterm>code |
|---|
| 37 |
indépendant de sa position</firstterm> (<acronym>PIC</acronym>, acronyme de |
|---|
| 38 |
<foreignphrase>position-independent code</foreignphrase>) |
|---|
| 39 |
<indexterm><primary>PIC</primary></indexterm>. |
|---|
| 40 |
Conceptuellement, cela signifie qu'ils peuvent être placés dans |
|---|
| 41 |
une position arbitraire de la mémoire lorsqu'ils sont chargés par |
|---|
| 42 |
l'exécutable. (Les fichiers objets destinés aux exécutables ne sont |
|---|
| 43 |
généralement pas compilés de cette manière.) La commande qui permet de lier |
|---|
| 44 |
des bibliothèques partagées nécessite des options spéciales qui la |
|---|
| 45 |
distinguent de celle permettant de lier un exécutable. En théorie, tout du |
|---|
| 46 |
moins. La réalité est, sur certains systèmes, beaucoup plus complexe. |
|---|
| 47 |
</para> |
|---|
| 48 |
|
|---|
| 49 |
<para> |
|---|
| 50 |
Les exemples suivants considèrent que le code source est un |
|---|
| 51 |
fichier <filename>foo.c</filename> et qu'une bibliothèque partagée |
|---|
| 52 |
<filename>foo.so</filename> doit être créée. Sans précision, le fichier objet |
|---|
| 53 |
intermédiaire est appelé <filename>foo.o</filename>. Une bibliothèque |
|---|
| 54 |
partagée peut contenir plusieurs fichiers objet. Cela dit, un seul est |
|---|
| 55 |
utilisé ici. |
|---|
| 56 |
</para> |
|---|
| 57 |
|
|---|
| 58 |
<!-- |
|---|
| 59 |
Note: Reading GNU Libtool sources is generally a good way of |
|---|
| 60 |
figuring out this information. The methods used within PostgreSQL |
|---|
| 61 |
source code are not necessarily ideal. |
|---|
| 62 |
--> |
|---|
| 63 |
|
|---|
| 64 |
<variablelist> |
|---|
| 65 |
<varlistentry> |
|---|
| 66 |
<term><systemitem class="osname">BSD/OS</systemitem></term> |
|---|
| 67 |
<listitem> |
|---|
| 68 |
<indexterm><primary>BSD/OS</primary><secondary>bibliothèque partagée</secondary></indexterm> |
|---|
| 69 |
<para> |
|---|
| 70 |
L'option du compilateur pour créer des <acronym>PIC</acronym> est |
|---|
| 71 |
<option>-fpic</option>. L'option de l'éditeur de liens pour créer des |
|---|
| 72 |
bibliothèques partagées est <option>-shared</option>. |
|---|
| 73 |
<programlisting>gcc -fpic -c foo.c |
|---|
| 74 |
ld -shared -o foo.so foo.o |
|---|
| 75 |
</programlisting> |
|---|
| 76 |
Ceci est applicable à partir de la version 4.0 de |
|---|
| 77 |
<systemitem class="osname">BSD/OS</systemitem>. |
|---|
| 78 |
</para> |
|---|
| 79 |
</listitem> |
|---|
| 80 |
</varlistentry> |
|---|
| 81 |
|
|---|
| 82 |
<varlistentry> |
|---|
| 83 |
<term><systemitem class="osname">FreeBSD</systemitem></term> |
|---|
| 84 |
<listitem> |
|---|
| 85 |
<indexterm><primary>FreeBSD</primary><secondary>bibliothèque partagée</secondary></indexterm> |
|---|
| 86 |
<para> |
|---|
| 87 |
L'option du compilateur pour créer des <acronym>PIC</acronym> est |
|---|
| 88 |
<option>-fpic</option>. L'option de l'éditeur de liens pour créer des |
|---|
| 89 |
bibliothèques partagées est <option>-shared</option>. |
|---|
| 90 |
<programlisting>gcc -fpic -c foo.c |
|---|
| 91 |
gcc -shared -o foo.so foo.o |
|---|
| 92 |
</programlisting> |
|---|
| 93 |
Ceci est applicable à partir de la version 3.0 de |
|---|
| 94 |
<systemitem class="osname">FreeBSD</systemitem>. |
|---|
| 95 |
</para> |
|---|
| 96 |
</listitem> |
|---|
| 97 |
</varlistentry> |
|---|
| 98 |
|
|---|
| 99 |
<varlistentry> |
|---|
| 100 |
<term><systemitem class="osname">HP-UX</systemitem></term> |
|---|
| 101 |
<listitem> |
|---|
| 102 |
<indexterm><primary>HP-UX</primary><secondary>bibliothèque partagée</secondary></indexterm> |
|---|
| 103 |
<para> |
|---|
| 104 |
L'option du compilateur du système pour créer des <acronym>PIC</acronym> |
|---|
| 105 |
est <option>+z</option>. Avec <application>GCC</application>, l'option |
|---|
| 106 |
est <option>-fpic</option>. Le |
|---|
| 107 |
commutateur de l'éditeur de liens pour les bibliothèques partagées est |
|---|
| 108 |
<option>-b</option>. |
|---|
| 109 |
Ainsi : |
|---|
| 110 |
<programlisting>cc +z -c foo.c |
|---|
| 111 |
</programlisting> |
|---|
| 112 |
ou : |
|---|
| 113 |
<programlisting>gcc -fpic -c foo.c |
|---|
| 114 |
</programlisting> |
|---|
| 115 |
puis : |
|---|
| 116 |
<programlisting>ld -b -o foo.sl foo.o |
|---|
| 117 |
</programlisting> |
|---|
| 118 |
<systemitem class="osname">HP-UX</systemitem> utilise l'extension |
|---|
| 119 |
<filename>.sl</filename> pour les bibliothèques partagées, à la différence |
|---|
| 120 |
de la plupart des autres systèmes. |
|---|
| 121 |
</para> |
|---|
| 122 |
</listitem> |
|---|
| 123 |
</varlistentry> |
|---|
| 124 |
|
|---|
| 125 |
<varlistentry> |
|---|
| 126 |
<term><systemitem class="osname">IRIX</systemitem></term> |
|---|
| 127 |
<listitem> |
|---|
| 128 |
<indexterm><primary>IRIX</primary><secondary>bibliothèque partagée</secondary></indexterm> |
|---|
| 129 |
<para> |
|---|
| 130 |
<acronym>PIC</acronym> est l'option par défaut. Aucune option de compilation |
|---|
| 131 |
particulière n'est nécessaire. Le commutateur de l'éditeur de liens pour |
|---|
| 132 |
produire des bibliothèques partagées est <option>-shared</option> : |
|---|
| 133 |
<programlisting>cc -c foo.c |
|---|
| 134 |
ld -shared -o foo.so foo.o |
|---|
| 135 |
</programlisting> |
|---|
| 136 |
</para> |
|---|
| 137 |
</listitem> |
|---|
| 138 |
</varlistentry> |
|---|
| 139 |
|
|---|
| 140 |
<varlistentry> |
|---|
| 141 |
<term><systemitem class="osname">Linux</systemitem></term> |
|---|
| 142 |
<listitem> |
|---|
| 143 |
<indexterm><primary>Linux</primary><secondary>bibliothèque partagée</secondary></indexterm> |
|---|
| 144 |
<para> |
|---|
| 145 |
L'option du compilateur pour créer des <acronym>PIC</acronym> est |
|---|
| 146 |
<option>-fpic</option>. Sur certaines plateformes et dans certaines |
|---|
| 147 |
situations, <option>-fPIC</option> doit être utilisé si |
|---|
| 148 |
<option>-fpic</option> ne fonctionne pas. Le manuel de GCC |
|---|
| 149 |
donne plus d'informations. L'option de compilation pour créer des |
|---|
| 150 |
bibliothèques partagées est <option>-shared</option>. Un exemple complet |
|---|
| 151 |
ressemble à : |
|---|
| 152 |
<programlisting>cc -fpic -c foo.c |
|---|
| 153 |
cc -shared -o foo.so foo.o |
|---|
| 154 |
</programlisting> |
|---|
| 155 |
</para> |
|---|
| 156 |
</listitem> |
|---|
| 157 |
</varlistentry> |
|---|
| 158 |
|
|---|
| 159 |
<varlistentry> |
|---|
| 160 |
<term><systemitem class="osname">MacOS X</systemitem></term> |
|---|
| 161 |
<listitem> |
|---|
| 162 |
<indexterm><primary>MacOS X</primary><secondary>bibliothèque partagée</secondary></indexterm> |
|---|
| 163 |
<para> |
|---|
| 164 |
L'exemple suivant suppose que les outils de développement sont installés. |
|---|
| 165 |
<programlisting>cc -c foo.c |
|---|
| 166 |
cc -bundle -flat_namespace -undefined suppress -o foo.so foo.o |
|---|
| 167 |
</programlisting> |
|---|
| 168 |
</para> |
|---|
| 169 |
</listitem> |
|---|
| 170 |
</varlistentry> |
|---|
| 171 |
|
|---|
| 172 |
<varlistentry> |
|---|
| 173 |
<term><systemitem class="osname">NetBSD</systemitem></term> |
|---|
| 174 |
<listitem> |
|---|
| 175 |
<indexterm><primary>NetBSD</primary><secondary>bibliothèque partagée</secondary></indexterm> |
|---|
| 176 |
<para> |
|---|
| 177 |
L'option du compilateur pour créer des <acronym>PIC</acronym> est |
|---|
| 178 |
<option>-fpic</option>. Pour les systèmes <acronym>ELF</acronym>, |
|---|
| 179 |
l'option de compilation pour lier les bibliothèques partagées |
|---|
| 180 |
est <option>-shared</option>. Sur les systèmes plus anciens et non-ELF, |
|---|
| 181 |
on utilise <literal>ld -Bshareable</literal>. |
|---|
| 182 |
<programlisting>gcc -fpic -c foo.c |
|---|
| 183 |
gcc -shared -o foo.so foo.o |
|---|
| 184 |
</programlisting> |
|---|
| 185 |
</para> |
|---|
| 186 |
</listitem> |
|---|
| 187 |
</varlistentry> |
|---|
| 188 |
|
|---|
| 189 |
<varlistentry> |
|---|
| 190 |
<term><systemitem class="osname">OpenBSD</systemitem></term> |
|---|
| 191 |
<listitem> |
|---|
| 192 |
<indexterm><primary>OpenBSD</primary><secondary>bibliothèque partagée</secondary></indexterm> |
|---|
| 193 |
<para> |
|---|
| 194 |
L'option du compilateur pour créer des <acronym>PIC</acronym> est |
|---|
| 195 |
<option>-fpic</option>. Les bibliothèques partagées peuvent être créées avec |
|---|
| 196 |
<literal>ld -Bshareable</literal>. |
|---|
| 197 |
<programlisting>gcc -fpic -c foo.c |
|---|
| 198 |
ld -Bshareable -o foo.so foo.o |
|---|
| 199 |
</programlisting> |
|---|
| 200 |
</para> |
|---|
| 201 |
</listitem> |
|---|
| 202 |
</varlistentry> |
|---|
| 203 |
|
|---|
| 204 |
<varlistentry> |
|---|
| 205 |
<term><systemitem class="osname">Solaris</systemitem></term> |
|---|
| 206 |
<listitem> |
|---|
| 207 |
<indexterm><primary>Solaris</primary><secondary>bibliothèque partagée</secondary></indexterm> |
|---|
| 208 |
<para> |
|---|
| 209 |
L'option du compilateur pour créer des <acronym>PIC</acronym> est |
|---|
| 210 |
<option>-KPIC</option> avec le compilateur de Sun et <option>-fpic</option> |
|---|
| 211 |
avec <application>GCC</application>. Pour lier les bibliothèques |
|---|
| 212 |
partagées, l'option de compilation est respectivement <option>-G</option> |
|---|
| 213 |
ou <option>-shared</option>. |
|---|
| 214 |
<programlisting>cc -KPIC -c foo.c |
|---|
| 215 |
cc -G -o foo.so foo.o |
|---|
| 216 |
</programlisting> |
|---|
| 217 |
ou |
|---|
| 218 |
<programlisting>gcc -fpic -c foo.c |
|---|
| 219 |
gcc -G -o foo.so foo.o |
|---|
| 220 |
</programlisting> |
|---|
| 221 |
</para> |
|---|
| 222 |
</listitem> |
|---|
| 223 |
</varlistentry> |
|---|
| 224 |
|
|---|
| 225 |
<varlistentry> |
|---|
| 226 |
<term><systemitem class="osname">Tru64 UNIX</systemitem></term> |
|---|
| 227 |
<listitem> |
|---|
| 228 |
<indexterm><primary>Tru64 UNIX</primary><secondary>bibliothèque partagée</secondary></indexterm> |
|---|
| 229 |
<indexterm><primary>Digital UNIX</primary><see>Tru64 UNIX</see></indexterm> |
|---|
| 230 |
<para> |
|---|
| 231 |
Par défaut, il s'agit de <acronym>PIC</acronym>. Ainsi, aucune directive |
|---|
| 232 |
particulière n'est à fournir pour la compilation. Pour l'édition de lien, des |
|---|
| 233 |
options spécifiques sont à fournir à <command>ld</command> : |
|---|
| 234 |
<programlisting>cc -c foo.c |
|---|
| 235 |
ld -shared -expect_unresolved '*' -o foo.so foo.o |
|---|
| 236 |
</programlisting> |
|---|
| 237 |
Une procédure identique doit être employée dans le cas où GCC est |
|---|
| 238 |
utilisé à la place du compilateur du système ; aucune option |
|---|
| 239 |
particulière n'est nécessaire. |
|---|
| 240 |
</para> |
|---|
| 241 |
</listitem> |
|---|
| 242 |
</varlistentry> |
|---|
| 243 |
|
|---|
| 244 |
<varlistentry> |
|---|
| 245 |
<term><systemitem class="osname">UnixWare</systemitem></term> |
|---|
| 246 |
<listitem> |
|---|
| 247 |
<indexterm><primary>UnixWare</primary><secondary>bibliothèque partagée</secondary></indexterm> |
|---|
| 248 |
<para> |
|---|
| 249 |
L'option de compilation pour créer des <acronym>PIC</acronym> est |
|---|
| 250 |
<option>-KPIC</option> avec le compilateur SCO et <option>-fpic</option> avec |
|---|
| 251 |
<productname>GCC</productname>. Pour lier des bibliothèques partagées, |
|---|
| 252 |
les options respectives sont <option>-G</option> et |
|---|
| 253 |
<option>-shared</option>. |
|---|
| 254 |
<programlisting>cc -K PIC -c foo.c |
|---|
| 255 |
cc -G -o foo.so foo.o |
|---|
| 256 |
</programlisting> |
|---|
| 257 |
ou |
|---|
| 258 |
<programlisting>gcc -fpic -c foo.c |
|---|
| 259 |
gcc -shared -o foo.so foo.o |
|---|
| 260 |
</programlisting> |
|---|
| 261 |
</para> |
|---|
| 262 |
</listitem> |
|---|
| 263 |
</varlistentry> |
|---|
| 264 |
|
|---|
| 265 |
</variablelist> |
|---|
| 266 |
|
|---|
| 267 |
<tip> |
|---|
| 268 |
<para> |
|---|
| 269 |
Si cela s'évère trop compliqué, |
|---|
| 270 |
<ulink url="http://www.gnu.org/software/libtool/"><productname>GNU Libtool</productname></ulink> |
|---|
| 271 |
peut être utilisé. Cet outil permet de s'affranchir des |
|---|
| 272 |
différences entre les nombreux systèmes au travers d'une interface |
|---|
| 273 |
uniformisée. |
|---|
| 274 |
</para> |
|---|
| 275 |
</tip> |
|---|
| 276 |
|
|---|
| 277 |
<para> |
|---|
| 278 |
La bibliothèque partagée résultante peut être chargée dans |
|---|
| 279 |
<productname>PostgreSQL</productname>. Lorsque l'on précise le nom du fichier |
|---|
| 280 |
dans la commande <command>CREATE FUNCTION</command>, il faut indiquer le nom |
|---|
| 281 |
de la bibliothèque partagée et non celui du fichier objet intermédiaire. |
|---|
| 282 |
L'extension standard pour les bibliothèques partagées (en général |
|---|
| 283 |
<literal>.so</literal> ou <literal>.sl</literal>) peut être omise dans la commande |
|---|
| 284 |
<command>CREATE FUNCTION</command>, et doit l'être pour une meilleure |
|---|
| 285 |
portabilité. |
|---|
| 286 |
</para> |
|---|
| 287 |
|
|---|
| 288 |
<para> |
|---|
| 289 |
La <xref linkend="xfunc-c-dynload"/> indique l'endroit où |
|---|
| 290 |
le serveur s'attend à trouver les fichiers de bibliothèques partagées. |
|---|
| 291 |
</para> |
|---|
| 292 |
|
|---|
| 293 |
<!-- |
|---|
| 294 |
Under AIX, object files are compiled normally but building the shared |
|---|
| 295 |
library requires a couple of steps. First, create the object file: |
|---|
| 296 |
.nf |
|---|
| 297 |
cc <other flags> -c foo.c |
|---|
| 298 |
.fi |
|---|
| 299 |
You must then create a symbol \*(lqexports\*(rq file for the object |
|---|
| 300 |
file: |
|---|
| 301 |
.nf |
|---|
| 302 |
mkldexport foo.o `pwd` > foo.exp |
|---|
| 303 |
.fi |
|---|
| 304 |
Finally, you can create the shared library: |
|---|
| 305 |
.nf |
|---|
| 306 |
ld <other flags> -H512 -T512 -o foo.so -e _nostart \e |
|---|
| 307 |
-bI:.../lib/postgres.exp -bE:foo.exp foo.o \e |
|---|
| 308 |
-lm -lc 2>/dev/null |
|---|
| 309 |
.fi |
|---|
| 310 |
--> |
|---|
| 311 |
|
|---|
| 312 |
</sect2> |
|---|