root/traduc/branches/bv747/manuel/dfunc.sgml

Revision 134, 12.2 kB (checked in by gleu, 3 years ago)

Relecture des chapitres 32 à 39.

Line 
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&nbsp;: 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&nbsp;:
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>&nbsp;:
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&nbsp;; 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 -->
Note: See TracBrowser for help on using the browser.