mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
There isn't a lot of user demand for AIX support, we have a bunch of
hacks to work around AIX-specific compiler bugs and idiosyncrasies,
and no one has stepped up to the plate to properly maintain it.
Remove support for AIX to get rid of that maintenance overhead. It's
still supported for stable versions.
The acute issue that triggered this decision was that after commit
8af2565248
, the AIX buildfarm members have been hitting this
assertion:
TRAP: failed Assert("(uintptr_t) buffer == TYPEALIGN(PG_IO_ALIGN_SIZE, buffer)"), File: "md.c", Line: 472, PID: 2949728
Apperently the "pg_attribute_aligned(a)" attribute doesn't work on AIX
for values larger than PG_IO_ALIGN_SIZE, for a static const variable.
That could be worked around, but we decided to just drop the AIX support
instead.
Discussion: https://www.postgresql.org/message-id/20240224172345.32@rfd.leadboat.com
Reviewed-by: Andres Freund, Noah Misch, Thomas Munro
206 lines
6.8 KiB
Plaintext
206 lines
6.8 KiB
Plaintext
<!-- doc/src/sgml/dfunc.sgml -->
|
|
|
|
<sect2 id="dfunc">
|
|
<title>Compiling and Linking Dynamically-Loaded Functions</title>
|
|
|
|
<para>
|
|
Before you are able to use your
|
|
<productname>PostgreSQL</productname> extension functions written in
|
|
C, they must be compiled and linked in a special way to produce a
|
|
file that can be dynamically loaded by the server. To be precise, a
|
|
<firstterm>shared library</firstterm> needs to be
|
|
created.<indexterm><primary>shared library</primary></indexterm>
|
|
|
|
</para>
|
|
|
|
<para>
|
|
For information beyond what is contained in this section
|
|
you should read the documentation of your
|
|
operating system, in particular the manual pages for the C compiler,
|
|
<command>cc</command>, and the link editor, <command>ld</command>.
|
|
In addition, the <productname>PostgreSQL</productname> source code
|
|
contains several working examples in the
|
|
<filename>contrib</filename> directory. If you rely on these
|
|
examples you will make your modules dependent on the availability
|
|
of the <productname>PostgreSQL</productname> source code, however.
|
|
</para>
|
|
|
|
<para>
|
|
Creating shared libraries is generally analogous to linking
|
|
executables: first the source files are compiled into object files,
|
|
then the object files are linked together. The object files need to
|
|
be created as <firstterm>position-independent code</firstterm>
|
|
(<acronym>PIC</acronym>),<indexterm><primary>PIC</primary></indexterm> which
|
|
conceptually means that they can be placed at an arbitrary location
|
|
in memory when they are loaded by the executable. (Object files
|
|
intended for executables are usually not compiled that way.) The
|
|
command to link a shared library contains special flags to
|
|
distinguish it from linking an executable (at least in theory
|
|
— on some systems the practice is much uglier).
|
|
</para>
|
|
|
|
<para>
|
|
In the following examples we assume that your source code is in a
|
|
file <filename>foo.c</filename> and we will create a shared library
|
|
<filename>foo.so</filename>. The intermediate object file will be
|
|
called <filename>foo.o</filename> unless otherwise noted. A shared
|
|
library can contain more than one object file, but we only use one
|
|
here.
|
|
</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">FreeBSD</systemitem>
|
|
<indexterm><primary>FreeBSD</primary><secondary>shared library</secondary></indexterm>
|
|
</term>
|
|
<listitem>
|
|
<para>
|
|
The compiler flag to create <acronym>PIC</acronym> is
|
|
<option>-fPIC</option>. To create shared libraries the compiler
|
|
flag is <option>-shared</option>.
|
|
<programlisting>
|
|
cc -fPIC -c foo.c
|
|
cc -shared -o foo.so foo.o
|
|
</programlisting>
|
|
This is applicable as of version 13.0 of
|
|
<systemitem class="osname">FreeBSD</systemitem>, older versions used
|
|
the <filename>gcc</filename> compiler.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>
|
|
<systemitem class="osname">Linux</systemitem>
|
|
<indexterm><primary>Linux</primary><secondary>shared library</secondary></indexterm>
|
|
</term>
|
|
<listitem>
|
|
<para>
|
|
The compiler flag to create <acronym>PIC</acronym> is
|
|
<option>-fPIC</option>.
|
|
The compiler flag to create a shared library is
|
|
<option>-shared</option>. A complete example looks like this:
|
|
<programlisting>
|
|
cc -fPIC -c foo.c
|
|
cc -shared -o foo.so foo.o
|
|
</programlisting>
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>
|
|
<systemitem class="osname">macOS</systemitem>
|
|
<indexterm><primary>macOS</primary><secondary>shared library</secondary></indexterm>
|
|
</term>
|
|
<listitem>
|
|
<para>
|
|
Here is an example. It assumes the developer tools are installed.
|
|
<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</systemitem>
|
|
<indexterm><primary>NetBSD</primary><secondary>shared library</secondary></indexterm>
|
|
</term>
|
|
<listitem>
|
|
<para>
|
|
The compiler flag to create <acronym>PIC</acronym> is
|
|
<option>-fPIC</option>. For <acronym>ELF</acronym> systems, the
|
|
compiler with the flag <option>-shared</option> is used to link
|
|
shared libraries. On the older non-ELF systems, <literal>ld
|
|
-Bshareable</literal> is used.
|
|
<programlisting>
|
|
gcc -fPIC -c foo.c
|
|
gcc -shared -o foo.so foo.o
|
|
</programlisting>
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>
|
|
<systemitem class="osname">OpenBSD</systemitem>
|
|
<indexterm><primary>OpenBSD</primary><secondary>shared library</secondary></indexterm>
|
|
</term>
|
|
<listitem>
|
|
<para>
|
|
The compiler flag to create <acronym>PIC</acronym> is
|
|
<option>-fPIC</option>. <literal>ld -Bshareable</literal> is
|
|
used to link shared libraries.
|
|
<programlisting>
|
|
gcc -fPIC -c foo.c
|
|
ld -Bshareable -o foo.so foo.o
|
|
</programlisting>
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>
|
|
<systemitem class="osname">Solaris</systemitem>
|
|
<indexterm><primary>Solaris</primary><secondary>shared library</secondary></indexterm>
|
|
</term>
|
|
<listitem>
|
|
<para>
|
|
The compiler flag to create <acronym>PIC</acronym> is
|
|
<option>-KPIC</option> with the Sun compiler and
|
|
<option>-fPIC</option> with <application>GCC</application>. To
|
|
link shared libraries, the compiler option is
|
|
<option>-G</option> with either compiler or alternatively
|
|
<option>-shared</option> with <application>GCC</application>.
|
|
<programlisting>
|
|
cc -KPIC -c foo.c
|
|
cc -G -o foo.so foo.o
|
|
</programlisting>
|
|
or
|
|
<programlisting>
|
|
gcc -fPIC -c foo.c
|
|
gcc -G -o foo.so foo.o
|
|
</programlisting>
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
</variablelist>
|
|
|
|
<tip>
|
|
<para>
|
|
If this is too complicated for you, you should consider using
|
|
<ulink url="https://www.gnu.org/software/libtool/">
|
|
<productname>GNU Libtool</productname></ulink>,
|
|
which hides the platform differences behind a uniform interface.
|
|
</para>
|
|
</tip>
|
|
|
|
<para>
|
|
The resulting shared library file can then be loaded into
|
|
<productname>PostgreSQL</productname>. When specifying the file name
|
|
to the <command>CREATE FUNCTION</command> command, one must give it
|
|
the name of the shared library file, not the intermediate object file.
|
|
Note that the system's standard shared-library extension (usually
|
|
<literal>.so</literal> or <literal>.sl</literal>) can be omitted from
|
|
the <command>CREATE FUNCTION</command> command, and normally should
|
|
be omitted for best portability.
|
|
</para>
|
|
|
|
<para>
|
|
Refer back to <xref linkend="xfunc-c-dynload"/> about where the
|
|
server expects to find the shared library files.
|
|
</para>
|
|
|
|
</sect2>
|