root/traduc/trunk/postgresql/dfunc.xml

Revision 1090, 11.8 kB (checked in by sas, 5 months ago)

Et hop...

  • Property svn:keywords set to Date Author Revision
Line 
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&nbsp;:
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&nbsp;:
110 <programlisting>cc +z -c foo.c
111 </programlisting>
112       ou&nbsp;:
113 <programlisting>gcc -fpic -c foo.c
114 </programlisting>
115       puis&nbsp;:
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>&nbsp;:
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 à&nbsp;:
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>&nbsp;:
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&nbsp;; 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` &gt; 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>
Note: See TracBrowser for help on using the browser.