-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathdfunc.sgml
339 lines (314 loc) · 11.7 KB
/
dfunc.sgml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
<!--
$PostgreSQL: pgsql/doc/src/sgml/dfunc.sgml,v 1.28 2004/11/15 06:32:13 neilc Exp $
-->
<sect2 id="dfunc">
<title id="dfunc-title">Compilar e ligar as funções carregadas dinamicamente</title>
<para>
Antes que as funções escritas em C para estender o
<productname>PostgreSQL</productname> possam ser utilizadas, estas funções
precisam ser compiladas e ligadas de uma forma especial para produzir um
arquivo que possa ser carregado dinamicamente pelo servidor. Para ser exato,
precisa ser criada uma <firstterm>biblioteca compartilhada</firstterm>.
<indexterm><primary>biblioteca compartilhada</primary></indexterm>
</para>
<para>
Para obter informações além das contidas nesta seção deve ser lida a
documentação do sistema operacional, em particular as páginas do manual do
compilador C, <command>gcc</command>, e do editor de ligação,
<command>ld</command>.
Além disso, o código fonte do <productname>PostgreSQL</productname> contém
vários exemplos funcionais no diretório
<filename class="directory">contrib</filename>. Entretanto, a dependência
destes exemplos torna os módulos dependentes da disponibilidade do código
fonte do <productname>PostgreSQL</productname>.
</para>
<para>
<indexterm><primary>PIC</primary></indexterm>
Criar bibliotecas compartilhadas geralmente é análogo a ligar executáveis:
primeiro os arquivos fonte são compilados em arquivos objetos e, depois, os
arquivos objeto são ligados. Os arquivos objeto precisam ser criados como
<firstterm>código independente de posição</firstterm>
(<acronym>PIC</acronym>), o que significa conceitualmente que podem ser
colocados em uma posição de memória arbitrária ao serem carregados pelo
executável (Os arquivos objeto destinados a executáveis geralmente não são
compilados deste modo). O comando para ligar uma biblioteca compartilhada
contém sinalizadores especiais para distinguir da ligação de um executável
(ao menos em teoria — em alguns sistemas a prática é muito mais feia).
</para>
<para>
Nos exemplos a seguir é assumido que o código fonte está no arquivo
<filename>foo.c</filename>, e que é criada a biblioteca compartilhada
<filename>foo.so</filename>. O arquivo objeto intermediário se chama
<filename>foo.o</filename>, a não ser que seja dito o contrário. A biblioteca
compartilhada pode conter mais de um arquivo objeto, mas aqui é utilizado
apenas um arquivo.
</para>
<!--
Note: Reading GNU Libtool sources is generally a good way of
figuring out this information. The methods used within PostgreSQL
source code are not necessarily ideal.
-->
<variablelist>
<varlistentry>
<term><systemitem class="osname">BSD/OS</></term>
<indexterm><primary>BSD/OS</><secondary>biblioteca compartilhada</secondary></>
<listitem>
<para>
O sinalizador do compilador para criar <acronym>PIC</acronym> é
<option>-fpic</option>. O sinalizador do ligador para criar biblioteca
compartilhada é <option>-shared</option>.
<programlisting>
gcc -fpic -c foo.c
ld -shared -o foo.so foo.o
</programlisting>
Isto se aplica a partir da versão 4.0 do
<systemitem class="osname">BSD/OS</>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><systemitem class="osname">FreeBSD</></term>
<indexterm><primary>FreeBSD</><secondary>biblioteca compartilhada</secondary></>
<listitem>
<para>
O sinalizador do compilador para criar <acronym>PIC</acronym> é
<option>-fpic</option>. Para criar bibliotecas compartilhadas o
sinalizador do compilador é <option>-shared</option>.
<programlisting>
gcc -fpic -c foo.c
gcc -shared -o foo.so foo.o
</programlisting>
Isto se aplica a partir a versão 3.0 do
<systemitem class="osname">FreeBSD</>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><systemitem class="osname">HP-UX</></term>
<indexterm><primary>HP-UX</><secondary>biblioteca compartilhada</secondary></>
<listitem>
<para>
O sinalizador do compilador do sistema para criar <acronym>PIC</acronym>
é <option>+z</option>. Quando se utiliza o <application>GCC</application>
é <option>-fpic</option>. O sinalizador do ligador para criar bibliotecas
compartilhadas é <option>-b</option>. Portanto
<programlisting>
cc +z -c foo.c
</programlisting>
ou
<programlisting>
gcc -fpic -c foo.c
</programlisting>
e depois
<programlisting>
ld -b -o foo.sl foo.o
</programlisting>
O <systemitem class="osname">HP-UX</systemitem> utiliza a extensão
<filename>.sl</filename> para bibliotecas compartilhadas, diferentemente
da maioria dos outros sistemas.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><systemitem class="osname">IRIX</></term>
<indexterm><primary>IRIX</><secondary>biblioteca compartilhada</secondary></>
<listitem>
<para>
<acronym>PIC</acronym> é o padrão, não é necessário nenhum sinalizador
especial do compilador. A opção do ligador para criar bibliotecas
compartilhadas é <option>-shared</option>.
<programlisting>
cc -c foo.c
ld -shared -o foo.so foo.o
</programlisting>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><systemitem class="osname">Linux</></term>
<indexterm><primary>Linux</><secondary>biblioteca compartilhada</secondary></>
<listitem>
<para>
O sinalizador do compilador para criar <acronym>PIC</acronym> é
<option>-fpic</option>. Em certas situações em algumas plataformas deve
ser utilizado <option>-fPIC</option> se <option>-fpic</option> não
funcionar. Deve ser consultado o manual do GCC para obter mais
informações. O sinalizador do compilador para criar a biblioteca
compartilhada é <option>-shared</option>. Um exemplo completo se parece
com:
<programlisting>
cc -fpic -c foo.c
cc -shared -o foo.so foo.o
</programlisting>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><systemitem class="osname">MacOS X</></term>
<indexterm><primary>MacOS X</><secondary>biblioteca compartilhada</secondary></>
<listitem>
<para>
Abaixo segue um exemplo. É assumido que as ferramentas de desenvolvimento
estão instaladas.
<programlisting>
cc -c foo.c
cc -bundle -flat_namespace -undefined suppress -o foo.so foo.o
</programlisting>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><systemitem class="osname">NetBSD</></term>
<indexterm><primary>NetBSD</><secondary>biblioteca compartilhada</secondary></>
<listitem>
<para>
O sinalizador do compilador para criar <acronym>PIC</acronym> é
<option>-fpic</option>. Nos sistemas <acronym>ELF</acronym>, é utilizado
o compilador com o sinalizador <option>-shared</option> para ligar as
bibliotecas compartilhadas. Nos sistemas antigos, não-ELF, é utilizado
<literal>ld -Bshareable</literal>.
<programlisting>
gcc -fpic -c foo.c
gcc -shared -o foo.so foo.o
</programlisting>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><systemitem class="osname">OpenBSD</></term>
<indexterm><primary>OpenBSD</><secondary>biblioteca compartilhada</secondary></>
<listitem>
<para>
O sinalizador do compilador para criar <acronym>PIC</acronym> é
<option>-fpic</option>. É utilizado <literal>ld -Bshareable</literal>
para ligar bibliotecas compartilhadas.
<programlisting>
gcc -fpic -c foo.c
ld -Bshareable -o foo.so foo.o
</programlisting>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><systemitem class="osname">Solaris</></term>
<indexterm><primary>Solaris</><secondary>biblioteca compartilhada</secondary></>
<listitem>
<para>
O sinalizador do compilador para criar <acronym>PIC</acronym> é
<option>-KPIC</option> quando é utilizado o compilador da Sun, e
<option>-fpic</option> quando é utilizado o
<application>GCC</application>. Para ligar bibliotecas compartilhadas a
opção do compilador é <option>-G</option> para os dois compiladores ou,
como alternativa, <option>-shared</option> quando é utilizado o
<application>GCC</application>.
<programlisting>
cc -KPIC -c foo.c
cc -G -o foo.so foo.o
</programlisting>
ou
<programlisting>
gcc -fpic -c foo.c
gcc -G -o foo.so foo.o
</programlisting>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><systemitem class="osname">Tru64 UNIX</></term>
<indexterm><primary>Tru64 UNIX</><secondary>biblioteca compartilhada</secondary></>
<indexterm><primary>Digital UNIX</><see>Tru64 UNIX</></>
<listitem>
<para>
<acronym>PIC</acronym> é o padrão e, portanto, o comando para compilar é o
usual. É utilizado <command>ld</command> com opções especiais para ligar:
<programlisting>
cc -c foo.c
ld -shared -expect_unresolved '*' -o foo.so foo.o
</programlisting>
O mesmo procedimento é empregado quando GCC é utilizado no lugar
do compilador do sistema; nenhuma opção especial é necessária.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><systemitem class="osname">UnixWare</></term>
<indexterm><primary>UnixWare</><secondary>biblioteca compartilhada</secondary></>
<listitem>
<para>
O sinalizador do compilador para criar <acronym>PIC</acronym> é
<option>-K PIC</option> quando é utilizado o compilador da SCO, e
<option>-fpic</option> no <productname>GCC</productname>. Para ligar
bibliotecas compartilhadas a opção do compilador é <option>-G</option>
quando é utilizado o compilador da SCO e <option>-shared</option> quando
é utilizado o <productname>GCC</productname>.
<programlisting>
cc -K PIC -c foo.c
cc -G -o foo.so foo.o
</programlisting>
or
<programlisting>
gcc -fpic -c foo.c
gcc -shared -o foo.so foo.o
</programlisting>
</para>
</listitem>
</varlistentry>
</variablelist>
<tip>
<para>
Caso julgue muito complicado, poderá ser levado em consideração a utilização
da <ulink url="http://www.gnu.org/software/libtool/"><productname>GNU
Libtool</productname></ulink>, que esconde as diferenças entre as plataformas
atrás de uma interface uniforme.
</para>
</tip>
<para>
O arquivo de biblioteca compartilhada produzido pode então ser carregado no
<productname>PostgreSQL</productname>. Ao se especificar o nome do arquivo
no comando <command>CREATE FUNCTION</command>, deve ser especificado o nome
do arquivo da biblioteca compartilhada, e não do arquivo objeto intermediário.
Deve ser observado que a extensão padrão do sistema para biblioteca
compartilhada (geralmente <literal>.so</literal> ou <literal>.sl</literal>)
pode ser omitida no comando <command>CREATE FUNCTION</command>, e normalmente
deve ser omitida para uma melhor portabilidade.
</para>
<para>
Veja na <xref linkend="xfunc-c-dynload"> onde o servidor espera encontrar os
arquivos de biblioteca compartilhada.
</para>
<!--
Under AIX, object files are compiled normally but building the shared
library requires a couple of steps. First, create the object file:
.nf
cc <other flags> -c foo.c
.fi
You must then create a symbol \*(lqexports\*(rq file for the object
file:
.nf
mkldexport foo.o `pwd` > foo.exp
.fi
Finally, you can create the shared library:
.nf
ld <other flags> -H512 -T512 -o foo.so -e _nostart \e
-bI:.../lib/postgres.exp -bE:foo.exp foo.o \e
-lm -lc 2>/dev/null
.fi
-->
</sect2>
<!-- Keep this comment at the end of the file
Local variables:
mode:sgml
sgml-omittag:nil
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-tabs-mode:nil
sgml-indent-data:t
sgml-parent-document:nil
sgml-default-dtd-file:"./reference.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:("/usr/share/sgml/catalog")
sgml-local-ecat-files:nil
End:
-->