| 1 |
<!-- |
|---|
| 2 |
$Header: /var/lib/cvs/pgsql-fr/sgml/dfunc.sgml,v 1.6.2.2 2005/07/15 06:33:37 guillaume Exp $ |
|---|
| 3 |
--> |
|---|
| 4 |
|
|---|
| 5 |
<sect2 id="dfunc"> |
|---|
| 6 |
<title id="dfunc-title">Compiler et lier des fonctions chargées |
|---|
| 7 |
dynamiquement</title> |
|---|
| 8 |
|
|---|
| 9 |
<para> |
|---|
| 10 |
Avant d'être en mesure d'utiliser des fonctions d'extension écrites en C dans |
|---|
| 11 |
<productname>PostgreSQL</productname>, elles doivent être compilées et liées |
|---|
| 12 |
d'une manière particulière afin de produire un fichier pouvant être chargé |
|---|
| 13 |
dynamiquement par le serveur. Pour être plus précis, une |
|---|
| 14 |
<firstterm>bibliothèque partagée</firstterm> doit être créée. |
|---|
| 15 |
<indexterm><primary>bibliothèque partagée</primary></indexterm> |
|---|
| 16 |
</para> |
|---|
| 17 |
|
|---|
| 18 |
<para> |
|---|
| 19 |
Pour obtenir plus d'informations sur ce qui est abordé dans cette section, |
|---|
| 20 |
vous devrez lire la documentation de votre système d'exploitation, en |
|---|
| 21 |
particulier les pages traitant du compilateur C, <command>cc</command>, ainsi |
|---|
| 22 |
que celle sur l'éditeur de lien, <command>ld</command>. Par ailleurs, le code |
|---|
| 23 |
source de <productname>PostgreSQL</productname> contient plusieurs exemples |
|---|
| 24 |
fonctionnels contenu dans le répertoire <filename>contrib</filename>. |
|---|
| 25 |
Néanmoins, en vous appuyant sur ces exemples, vous créerez des modules |
|---|
| 26 |
dépendants de la disponibilité du code source de |
|---|
| 27 |
<productname>PostgreSQL</productname>. |
|---|
| 28 |
</para> |
|---|
| 29 |
|
|---|
| 30 |
<para> |
|---|
| 31 |
<indexterm><primary>PIC</primary></indexterm> La création de bibliothèques partagées est un |
|---|
| 32 |
processus analogue à celui utilisé pour lier des exécutables : en premier |
|---|
| 33 |
lieu, les sources sont compilées en fichiers objets puis sont liées ensemble. |
|---|
| 34 |
Les fichiers objets doivent être compilés sous la forme de <firstterm>code |
|---|
| 35 |
à position indépendante</firstterm> (<acronym>PIC</acronym>, acronyme de |
|---|
| 36 |
<foreignphrase>position-independent |
|---|
| 37 |
code</foreignphrase>)<indexterm><primary>PIC</primary></ indexterm>. |
|---|
| 38 |
Conceptuellement, cela correspond au fait qu'ils peuvent être placés à |
|---|
| 39 |
une position arbitraire de la mémoire lorsqu'ils sont chargés par |
|---|
| 40 |
l'exécutable (les fichiers objets destinés aux exécutables ne sont |
|---|
| 41 |
généralement pas compilés de cette manière). La commande permettant de lier |
|---|
| 42 |
des bibliothèques partagées nécessite des options spéciales permettant de la |
|---|
| 43 |
distinguer d'une liaison pour un exécutable. Enfin, ceci est la théorie. La |
|---|
| 44 |
réalité est moins belle sur certains systèmes. |
|---|
| 45 |
</para> |
|---|
| 46 |
|
|---|
| 47 |
<para> |
|---|
| 48 |
Dans les exemples suivants, nous supposons que le code source est un |
|---|
| 49 |
fichier <filename>foo.c</filename> et que nous souhaitons créer une |
|---|
| 50 |
bibliothèque partagée <filename>foo.so</filename>. Le fichier objet |
|---|
| 51 |
intermédiaire sera appelé <filename>foo.o</filename> sauf si précisé |
|---|
| 52 |
autrement. Une bibliothèque partagée peut contenir plus d'un fichier |
|---|
| 53 |
objet. Ceci dit, nous n'en utiliserons qu'un ici. |
|---|
| 54 |
</para> |
|---|
| 55 |
|
|---|
| 56 |
<!-- |
|---|
| 57 |
Note: Reading GNU Libtool sources is generally a good way of |
|---|
| 58 |
figuring out this information. The methods used within PostgreSQL |
|---|
| 59 |
source code are not necessarily ideal. |
|---|
| 60 |
--> |
|---|
| 61 |
|
|---|
| 62 |
<variablelist> |
|---|
| 63 |
<varlistentry> |
|---|
| 64 |
<term><systemitem class="osname">BSD/OS</></term> |
|---|
| 65 |
<indexterm><primary>BSD/OS</><secondary>bibliothèque partagée</></> |
|---|
| 66 |
<listitem> |
|---|
| 67 |
<para> |
|---|
| 68 |
L'option du compilateur pour créer des <acronym>PIC</acronym> est |
|---|
| 69 |
<option>-fpic</option>. L'option de l'éditeur de liens pour créer des |
|---|
| 70 |
bibliothèques partagées est <option>-shared</option>. |
|---|
| 71 |
<programlisting> |
|---|
| 72 |
gcc -fpic -c foo.c |
|---|
| 73 |
ld -shared -o foo.so foo.o |
|---|
| 74 |
</programlisting> |
|---|
| 75 |
Ceci est applicable à partir de la version 4.0 de |
|---|
| 76 |
<systemitem class="osname">BSD/OS</>. |
|---|
| 77 |
</para> |
|---|
| 78 |
</listitem> |
|---|
| 79 |
</varlistentry> |
|---|
| 80 |
|
|---|
| 81 |
<varlistentry> |
|---|
| 82 |
<term><systemitem class="osname">FreeBSD</></term> |
|---|
| 83 |
<indexterm><primary>FreeBSD</><secondary>bibliothèque partagée</></> |
|---|
| 84 |
<listitem> |
|---|
| 85 |
<para> |
|---|
| 86 |
L'option du compilateur pour créer des <acronym>PIC</acronym> est |
|---|
| 87 |
<option>-fpic</option>. L'option de l'éditeur de liens pour créer des |
|---|
| 88 |
bibliothèques partagées est <option>-shared</option>. |
|---|
| 89 |
<programlisting> |
|---|
| 90 |
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</>. |
|---|
| 95 |
</para> |
|---|
| 96 |
</listitem> |
|---|
| 97 |
</varlistentry> |
|---|
| 98 |
|
|---|
| 99 |
<varlistentry> |
|---|
| 100 |
<term><systemitem class="osname">HP-UX</></term> |
|---|
| 101 |
<indexterm><primary>HP-UX</><secondary>bibliothèque partagée</></> |
|---|
| 102 |
<listitem> |
|---|
| 103 |
<para> |
|---|
| 104 |
L'option du compilateur système pour créer des <acronym>PIC</acronym> |
|---|
| 105 |
est <option>+z</option>. Lorsque vous utilisez |
|---|
| 106 |
<application>GCC</application>, l'option 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> |
|---|
| 111 |
cc +z -c foo.c |
|---|
| 112 |
</programlisting> |
|---|
| 113 |
ou |
|---|
| 114 |
<programlisting> |
|---|
| 115 |
gcc -fpic -c foo.c |
|---|
| 116 |
</programlisting> |
|---|
| 117 |
puis |
|---|
| 118 |
<programlisting> |
|---|
| 119 |
ld -b -o foo.sl foo.o |
|---|
| 120 |
</programlisting> |
|---|
| 121 |
<systemitem class="osname">HP-UX</systemitem> utilise l'extension |
|---|
| 122 |
<filename>.sl</filename> pour les bibliothèques partagées, à la différence |
|---|
| 123 |
de la plupart des autres systèmes. |
|---|
| 124 |
</para> |
|---|
| 125 |
</listitem> |
|---|
| 126 |
</varlistentry> |
|---|
| 127 |
|
|---|
| 128 |
<varlistentry> |
|---|
| 129 |
<term><systemitem class="osname">IRIX</systemitem></term> |
|---|
| 130 |
<indexterm><primary>IRIX</primary><secondary>bibliothèque partagée</secondary></indexterm> |
|---|
| 131 |
<listitem> |
|---|
| 132 |
<para> |
|---|
| 133 |
<acronym>PIC</acronym> est l'option par défaut. Aucune option de compilation |
|---|
| 134 |
particulière n'est nécessaire. Le commutateur de l'éditeur de liens pour |
|---|
| 135 |
produire des bibliothèques partagées est <option>-shared</option>. |
|---|
| 136 |
<programlisting> |
|---|
| 137 |
cc -c foo.c |
|---|
| 138 |
ld -shared -o foo.so foo.o |
|---|
| 139 |
</programlisting> |
|---|
| 140 |
</para> |
|---|
| 141 |
</listitem> |
|---|
| 142 |
</varlistentry> |
|---|
| 143 |
|
|---|
| 144 |
<varlistentry> |
|---|
| 145 |
<term><systemitem class="osname">Linux</systemitem></term> |
|---|
| 146 |
<indexterm><primary>Linux</primary><secondary>bibliothèque partagée</secondary></indexterm> |
|---|
| 147 |
<listitem> |
|---|
| 148 |
<para> |
|---|
| 149 |
L'option de compilation pour créer des <acronym>PIC</acronym> est |
|---|
| 150 |
<option>-fpic</option>. Sur certaines plateformes et dans certaines |
|---|
| 151 |
situations, <option>-fPIC</option> doit être utilisé si |
|---|
| 152 |
<option>-fpic</option> ne fonctionne pas. Reportez-vous au manuel de GCC |
|---|
| 153 |
pour plus d'informations. L'option de compilation pour créer des |
|---|
| 154 |
bibliothèques partagées est <option>-shared</option>. Un exemple complet |
|---|
| 155 |
devrait ressembler à ce qui suit : |
|---|
| 156 |
<programlisting> |
|---|
| 157 |
cc -fpic -c foo.c |
|---|
| 158 |
cc -shared -o foo.so foo.o |
|---|
| 159 |
</programlisting> |
|---|
| 160 |
</para> |
|---|
| 161 |
</listitem> |
|---|
| 162 |
</varlistentry> |
|---|
| 163 |
|
|---|
| 164 |
<varlistentry> |
|---|
| 165 |
<term><systemitem class="osname">MacOS X</systemitem></term> |
|---|
| 166 |
<indexterm><primary>MacOS X</primary><secondary>bibliothèque partagée</secondary></indexterm> |
|---|
| 167 |
<listitem> |
|---|
| 168 |
<para> |
|---|
| 169 |
Voici un exemple. Il suppose que les outils de développement sont installés. |
|---|
| 170 |
<programlisting> |
|---|
| 171 |
cc -c foo.c |
|---|
| 172 |
cc -bundle -flat_namespace -undefined suppress -o foo.so foo.o |
|---|
| 173 |
</programlisting> |
|---|
| 174 |
</para> |
|---|
| 175 |
</listitem> |
|---|
| 176 |
</varlistentry> |
|---|
| 177 |
|
|---|
| 178 |
<varlistentry> |
|---|
| 179 |
<term><systemitem class="osname">NetBSD</systemitem></term> |
|---|
| 180 |
<indexterm><primary>NetBSD</primary><secondary>bibliothèque partagée</secondary></indexterm> |
|---|
| 181 |
<listitem> |
|---|
| 182 |
<para> |
|---|
| 183 |
L'option de compilation pour créer des <acronym>PIC</acronym> est |
|---|
| 184 |
<option>-fpic</option>. Pour les systèmes <acronym>ELF</acronym>, |
|---|
| 185 |
l'option de compilation pour lier les bibliothèques partagées |
|---|
| 186 |
est <option>-shared</option>. Sur les systèmes plus anciens n'étant pas ELF, |
|---|
| 187 |
on utilise <literal>ld -Bshareable</literal>. |
|---|
| 188 |
<programlisting> |
|---|
| 189 |
gcc -fpic -c foo.c |
|---|
| 190 |
gcc -shared -o foo.so foo.o |
|---|
| 191 |
</programlisting> |
|---|
| 192 |
</para> |
|---|
| 193 |
</listitem> |
|---|
| 194 |
</varlistentry> |
|---|
| 195 |
|
|---|
| 196 |
<varlistentry> |
|---|
| 197 |
<term><systemitem class="osname">OpenBSD</systemitem></term> |
|---|
| 198 |
<indexterm><primary>OpenBSD</primary><secondary>bibliothèque partagée</secondary></indexterm> |
|---|
| 199 |
<listitem> |
|---|
| 200 |
<para> |
|---|
| 201 |
L'option de compilation pour créer des <acronym>PIC</acronym> est |
|---|
| 202 |
<option>-fpic</option>. Les bibliothèques partagées peuvent être créées avec |
|---|
| 203 |
la commande suivante <literal>ld -Bshareable</literal>. |
|---|
| 204 |
<programlisting> |
|---|
| 205 |
gcc -fpic -c foo.c |
|---|
| 206 |
ld -Bshareable -o foo.so foo.o |
|---|
| 207 |
</programlisting> |
|---|
| 208 |
</para> |
|---|
| 209 |
</listitem> |
|---|
| 210 |
</varlistentry> |
|---|
| 211 |
|
|---|
| 212 |
<varlistentry> |
|---|
| 213 |
<term><systemitem class="osname">Solaris</systemitem></term> |
|---|
| 214 |
<indexterm><primary>Solaris</primary><secondary>bibliothèque partagée</secondary></indexterm> |
|---|
| 215 |
<listitem> |
|---|
| 216 |
<para> |
|---|
| 217 |
L'option de compilation pour créer des <acronym>PIC</acronym> est |
|---|
| 218 |
<option>-KPIC</option> avec le compilateur de Sun et <option>-fpic</option> |
|---|
| 219 |
avec <application>GCC</application>. Pour lier les bibliothèques |
|---|
| 220 |
partagées, l'option de compilation est respectivement <option>-G</option> |
|---|
| 221 |
ou <option>-shared</option>. |
|---|
| 222 |
<programlisting> |
|---|
| 223 |
cc -KPIC -c foo.c |
|---|
| 224 |
cc -G -o foo.so foo.o |
|---|
| 225 |
</programlisting> |
|---|
| 226 |
ou |
|---|
| 227 |
<programlisting> |
|---|
| 228 |
gcc -fpic -c foo.c |
|---|
| 229 |
gcc -G -o foo.so foo.o |
|---|
| 230 |
</programlisting> |
|---|
| 231 |
</para> |
|---|
| 232 |
</listitem> |
|---|
| 233 |
</varlistentry> |
|---|
| 234 |
|
|---|
| 235 |
<varlistentry> |
|---|
| 236 |
<term><systemitem class="osname">Tru64 UNIX</systemitem></term> |
|---|
| 237 |
<indexterm><primary>Tru64 UNIX</primary><secondary>bibliothèque partagée</secondary></indexterm> |
|---|
| 238 |
<indexterm><primary>Digital UNIX</primary><see>Tru64 UNIX</see></indexterm> |
|---|
| 239 |
<listitem> |
|---|
| 240 |
<para> |
|---|
| 241 |
Par défaut, on compile des <acronym>PIC</acronym>. Ainsi, aucune directive |
|---|
| 242 |
particulière n'est à fournir pour la compilation. Pour lier, des |
|---|
| 243 |
options spécifiques sont à fournir à <command>ld</command> : |
|---|
| 244 |
<programlisting> |
|---|
| 245 |
cc -c foo.c |
|---|
| 246 |
ld -shared -expect_unresolved '*' -o foo.so foo.o |
|---|
| 247 |
</programlisting> |
|---|
| 248 |
Une procédure identique doit être employée dans le cas où GCC serait |
|---|
| 249 |
utilisé à la place du compilateur du système ; aucune option |
|---|
| 250 |
particulière n'est nécessaire. |
|---|
| 251 |
</para> |
|---|
| 252 |
</listitem> |
|---|
| 253 |
</varlistentry> |
|---|
| 254 |
|
|---|
| 255 |
<varlistentry> |
|---|
| 256 |
<term><systemitem class="osname">UnixWare</systemitem></term> |
|---|
| 257 |
<indexterm><primary>UnixWare</primary><secondary>bibliothèque partagée</secondary></indexterm> |
|---|
| 258 |
<listitem> |
|---|
| 259 |
<para> |
|---|
| 260 |
L'option de compilation pour créer des <acronym>PIC</acronym> est |
|---|
| 261 |
<option>-KPIC</option> avec le compilateur SCO et <option>-fpic</option> avec |
|---|
| 262 |
<productname>GCC</productname>. Pour lier des bibliothèques partagées, |
|---|
| 263 |
les options respectives sont <option>-G</option> et |
|---|
| 264 |
<option>-shared</option>. |
|---|
| 265 |
<programlisting> |
|---|
| 266 |
cc -K PIC -c foo.c |
|---|
| 267 |
cc -G -o foo.so foo.o |
|---|
| 268 |
</programlisting> |
|---|
| 269 |
ou |
|---|
| 270 |
<programlisting> |
|---|
| 271 |
gcc -fpic -c foo.c |
|---|
| 272 |
gcc -shared -o foo.so foo.o |
|---|
| 273 |
</programlisting> |
|---|
| 274 |
</para> |
|---|
| 275 |
</listitem> |
|---|
| 276 |
</varlistentry> |
|---|
| 277 |
|
|---|
| 278 |
</variablelist> |
|---|
| 279 |
|
|---|
| 280 |
<tip> |
|---|
| 281 |
<para> |
|---|
| 282 |
Si cela vous semble compliqué, vous pouvez tenter d'utiliser |
|---|
| 283 |
<ulink url="http://www.gnu.org/software/libtool/"><productname>GNU |
|---|
| 284 |
Libtool</productname></ulink>. Cet outil permet de s'affranchir des |
|---|
| 285 |
différences entre les nombreux systèmes au travers d'une interface |
|---|
| 286 |
uniformisée. |
|---|
| 287 |
</para> |
|---|
| 288 |
</tip> |
|---|
| 289 |
|
|---|
| 290 |
<para> |
|---|
| 291 |
La bibliothèque partagée résultante peut être chargée dans |
|---|
| 292 |
<productname>PostgreSQL</productname>. Lorsque l'on spécifie le nom du fichier |
|---|
| 293 |
dans la commande <command>CREATE FUNCTION</command>, on doit lui donner le nom |
|---|
| 294 |
de la bibliothèque partagée et non celui du fichier objet intermédiaire. Notez |
|---|
| 295 |
bien que l'extension standard pour les bibliothèques partagées (en général |
|---|
| 296 |
<literal>.so</literal> ou <literal>.sl</literal>) peut être omise dans la commande |
|---|
| 297 |
<command>CREATE FUNCTION</command> et doit l'être pour obtenir une meilleure |
|---|
| 298 |
portabilité. |
|---|
| 299 |
</para> |
|---|
| 300 |
|
|---|
| 301 |
<para> |
|---|
| 302 |
Référez-vous à la <xref linkend="xfunc-c-dynload"> pour savoir à quel endroit |
|---|
| 303 |
le serveur s'attend à trouver les fichiers de bibliothèques partagées. |
|---|
| 304 |
</para> |
|---|
| 305 |
|
|---|
| 306 |
<!-- |
|---|
| 307 |
Under AIX, object files are compiled normally but building the shared |
|---|
| 308 |
library requires a couple of steps. First, create the object file: |
|---|
| 309 |
.nf |
|---|
| 310 |
cc <other flags> -c foo.c |
|---|
| 311 |
.fi |
|---|
| 312 |
You must then create a symbol \*(lqexports\*(rq file for the object |
|---|
| 313 |
file: |
|---|
| 314 |
.nf |
|---|
| 315 |
mkldexport foo.o `pwd` > foo.exp |
|---|
| 316 |
.fi |
|---|
| 317 |
Finally, you can create the shared library: |
|---|
| 318 |
.nf |
|---|
| 319 |
ld <other flags> -H512 -T512 -o foo.so -e _nostart \e |
|---|
| 320 |
-bI:.../lib/postgres.exp -bE:foo.exp foo.o \e |
|---|
| 321 |
-lm -lc 2>/dev/NULL |
|---|
| 322 |
.fi |
|---|
| 323 |
--> |
|---|
| 324 |
|
|---|
| 325 |
</sect2> |
|---|
| 326 |
|
|---|
| 327 |
<!-- Keep this comment at the end of the file |
|---|
| 328 |
Local variables: |
|---|
| 329 |
mode:sgml |
|---|
| 330 |
sgml-omittag:nil |
|---|
| 331 |
sgml-shorttag:t |
|---|
| 332 |
sgml-minimize-attributes:nil |
|---|
| 333 |
sgml-always-quote-attributes:t |
|---|
| 334 |
sgml-indent-step:1 |
|---|
| 335 |
sgml-indent-tabs-mode:nil |
|---|
| 336 |
sgml-indent-data:t |
|---|
| 337 |
sgml-parent-document:nil |
|---|
| 338 |
sgml-default-dtd-file:"./reference.ced" |
|---|
| 339 |
sgml-exposed-tags:nil |
|---|
| 340 |
sgml-local-catalogs:("/usr/share/sgml/catalog") |
|---|
| 341 |
sgml-local-ecat-files:nil |
|---|
| 342 |
End: |
|---|
| 343 |
--> |
|---|