mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-04 00:02:52 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			201 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			201 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<HTML>
 | 
						|
<HEAD>
 | 
						|
	<TITLE>The POSTGRES95 User Manual - Appendix A:</TITLE>
 | 
						|
</HEAD>
 | 
						|
 | 
						|
<BODY>
 | 
						|
 | 
						|
<font size=-1>
 | 
						|
<A HREF="pg95user.html">[ TOC ]</A> 
 | 
						|
<A HREF="refs.html">[ Previous ]</A> 
 | 
						|
[ Next ] 
 | 
						|
</font>
 | 
						|
<HR>
 | 
						|
<H1>Appendix A: Linking Dynamically-Loaded Functions</H1>
 | 
						|
<HR>
 | 
						|
     After you have created and  registered  a  user-defined
 | 
						|
     function,  your  work  is  essentially done.  POSTGRES,
 | 
						|
     however, must load the object code (e.g., a .o file, or
 | 
						|
     a  shared  library)  that implements your function.  As
 | 
						|
     previously mentioned, POSTGRES loads your code at  
 | 
						|
     runtime,  as  required.  In order to allow your code to be
 | 
						|
     dynamically loaded, you may have to compile  and  
 | 
						|
     linkedit  it  in  a  special  way.   This  section  briefly
 | 
						|
     describes how to  perform  the  compilation  and  
 | 
						|
     linkediting  required before you can load your user-defined
 | 
						|
     functions into a running POSTGRES  server.   Note  that
 | 
						|
     this process has  changed  as  of  Version  4.2.<A HREF="#11">11</A>  You
 | 
						|
     should  expect  to read (and reread, and re-reread) the
 | 
						|
     manual pages for the C compiler, cc(1),  and  the  link
 | 
						|
     editor,  ld(1),  if  you  have  specific questions.  In
 | 
						|
     addition, the regression test suites in  the  directory
 | 
						|
     /usr/local/postgres95/src/regress contain several 
 | 
						|
     working examples of this process.  If you copy  what  these
 | 
						|
     tests do, you should not have any problems.
 | 
						|
     The following terminology will be used below:
 | 
						|
     <DL>
 | 
						|
     <DT>Dynamic loading
 | 
						|
          <DD>is  what  POSTGRES  does  to  an object file.  The
 | 
						|
          object file is copied into  the  running  POSTGRES
 | 
						|
          server  and the functions and variables within the
 | 
						|
          file are made available to  the  functions  within
 | 
						|
          the  POSTGRES  process.   POSTGRES does this using
 | 
						|
          the dynamic  loading  mechanism  provided  by  the
 | 
						|
          operating system.
 | 
						|
 | 
						|
     <DT>Loading and link editing
 | 
						|
          <DD>is  what you do to an object file in order to produce 
 | 
						|
          another kind of object file  (e.g.,  an  executable 
 | 
						|
          program or a shared library).  You perform
 | 
						|
          this using the link editing program, ld(1).
 | 
						|
     </DL>
 | 
						|
<p>
 | 
						|
     The following general restrictions and notes also apply
 | 
						|
     to the discussion below.
 | 
						|
     <UL>
 | 
						|
      <LI>Paths  given  to the create function command must be
 | 
						|
        absolute paths (i.e., start with "/") that refer  to
 | 
						|
        directories  visible  on  the  machine  on which the
 | 
						|
        POSTGRES server is running.<A HREF="#12">12</A>
 | 
						|
      <LI>The  POSTGRES user must be able to traverse the path
 | 
						|
        given to the create function command and be able  to
 | 
						|
        read  the object file.  This is because the POSTGRES
 | 
						|
        server runs as the POSTGRES user, not  as  the  user
 | 
						|
        who  starts  up  the  frontend process.  (Making the
 | 
						|
        file or a higher-level directory  unreadable  and/or
 | 
						|
        unexecutable  by the "postgres" user is an extremely
 | 
						|
        common mistake.)
 | 
						|
      <LI>Symbol names defined within object  files  must  not
 | 
						|
        conflict  with each other or with symbols defined in
 | 
						|
        POSTGRES.
 | 
						|
      <LI>The GNU C compiler usually does not provide the special  
 | 
						|
        options that are required to use the operating
 | 
						|
        system's dynamic loader interface.  In  such  cases,
 | 
						|
        the  C compiler that comes with the operating system
 | 
						|
        must be used.
 | 
						|
     </UL>
 | 
						|
<p>
 | 
						|
<B>ULTRIX</B><br>
 | 
						|
     It is very  easy  to  build  dynamically-loaded  object
 | 
						|
     files  under  ULTRIX.  ULTRIX does not have any sharedlibrary 
 | 
						|
     mechanism and hence does not place any restrictions  on  
 | 
						|
     the  dynamic loader interface.  On the other
 | 
						|
     hand, we had to (re)write a non-portable dynamic loader
 | 
						|
     ourselves and could not use true shared libraries.
 | 
						|
     Under  ULTRIX,  the  only  restriction is that you must
 | 
						|
     produce each object file with the option -G 0.  (Notice
 | 
						|
     that  that's  the  numeral  ``0''  and  not  the letter
 | 
						|
     ``O'').  For example,
 | 
						|
     
 | 
						|
<pre>              # simple ULTRIX example
 | 
						|
              % cc -G 0 -c foo.c
 | 
						|
</pre>
 | 
						|
     produces an object file called foo.o that can  then  be
 | 
						|
     dynamically  loaded into POSTGRES.  No additional loading or link-editing must be performed.
 | 
						|
<p>
 | 
						|
<B>DEC OSF/1</B><br>
 | 
						|
     Under DEC OSF/1, you can take any  simple  object  file
 | 
						|
     and produce a shared object file by running the ld command over it with the correct options.  The commands to
 | 
						|
     do this look like:
 | 
						|
     
 | 
						|
<pre>              # simple DEC OSF/1 example
 | 
						|
              % cc -c foo.c
 | 
						|
              % ld -shared -expect_unresolved '*' -o foo.so foo.o
 | 
						|
</pre>
 | 
						|
     The  resulting  shared  object  file can then be loaded
 | 
						|
     into POSTGRES.  When specifying the object file name to
 | 
						|
     the  create function command, one must give it the name
 | 
						|
     of the shared object file (ending in .so)  rather  than
 | 
						|
     the  simple  object  file.<A HREF="#13">13</A> If the file you specify is
 | 
						|
     not a shared object, the backend will hang!
 | 
						|
<p>
 | 
						|
<B>SunOS 4.x, Solaris 2.x and HP-UX</B><br>
 | 
						|
     Under both SunOS 4.x, Solaris 2.x and HP-UX, the simple
 | 
						|
     object file must be created  by  compiling  the  source
 | 
						|
     file  with  special compiler flags and a shared library
 | 
						|
     must be produced.
 | 
						|
     The necessary steps with HP-UX are as follows.  The  +z
 | 
						|
     flag  to the HP-UX C compiler produces so-called 
 | 
						|
     "Position Independent Code" (PIC) and the  +u  flag  
 | 
						|
     removes
 | 
						|
     some  alignment restrictions that the PA-RISC architecture 
 | 
						|
     normally enforces.  The object file must be turned
 | 
						|
     into  a shared library using the HP-UX link editor with
 | 
						|
     the -b option.  This sounds complicated but is actually
 | 
						|
     very simple, since the commands to do it are just:
 | 
						|
<pre>              # simple HP-UX example
 | 
						|
              % cc +z +u -c foo.c
 | 
						|
              % ld -b -o foo.sl foo.o
 | 
						|
</pre>
 | 
						|
 | 
						|
     As with the .so files mentioned in the last subsection,
 | 
						|
     the create function command must be told which file  is
 | 
						|
     the  correct  file  to load (i.e., you must give it the
 | 
						|
     location of the shared library, or .sl file).
 | 
						|
     Under SunOS 4.x, the commands look like:
 | 
						|
     
 | 
						|
<pre>              # simple SunOS 4.x example
 | 
						|
              % cc -PIC -c foo.c
 | 
						|
              % ld -dc -dp -Bdynamic -o foo.so foo.o
 | 
						|
</pre>
 | 
						|
     and the equivalent lines under Solaris 2.x are:
 | 
						|
<pre>              # simple Solaris 2.x example
 | 
						|
              % cc -K PIC -c foo.c
 | 
						|
                   or
 | 
						|
              % gcc -fPIC -c foo.c
 | 
						|
              % ld -G -Bdynamic -o foo.so foo.o
 | 
						|
</pre>
 | 
						|
     When linking shared libraries, you may have to  specify
 | 
						|
     some  additional  shared  libraries  (typically  system
 | 
						|
     libraries, such as the C and math libraries) on your ld
 | 
						|
     command line.
 | 
						|
<HR>
 | 
						|
<A NAME="11"><B>11.</B></A> The  old  POSTGRES dynamic 
 | 
						|
loading mechanism required
 | 
						|
in-depth knowledge in terms of executable format,  placement
 | 
						|
and alignment of executable instructions within memory, etc.
 | 
						|
on the part of the person writing the dynamic loader.   Such
 | 
						|
loaders tended to be slow and buggy.  As of Version 4.2, the
 | 
						|
POSTGRES dynamic loading mechanism has been rewritten to use
 | 
						|
the dynamic loading mechanism provided by the operating 
 | 
						|
system.  This approach is generally faster, more  reliable  and
 | 
						|
more  portable  than our previous dynamic loading mechanism.
 | 
						|
The reason for this is that nearly all  modern  versions  of
 | 
						|
UNIX use a dynamic loading mechanism to implement shared 
 | 
						|
libraries and must therefore provide a fast and reliable 
 | 
						|
mechanism.   On  the  other  hand, the object file must be 
 | 
						|
postprocessed a bit before it can be loaded into  POSTGRES.   We
 | 
						|
hope  that  the large increase in speed and reliability will
 | 
						|
make up for the slight decrease in convenience.
 | 
						|
<hr width=50 align=left>
 | 
						|
<A NAME="12"><B>12.</B></A> Relative paths do in fact work, 
 | 
						|
but  are  relative  to
 | 
						|
the directory where the database resides (which is generally
 | 
						|
invisible to the frontend application).  Obviously, it makes
 | 
						|
no sense to make the path relative to the directory in which
 | 
						|
the user started the frontend application, since the  server
 | 
						|
could be running on a completely different machine!<br>
 | 
						|
<hr width=50 align=left>
 | 
						|
<A NAME="13"><B>13.</B></A> Actually, POSTGRES does not care
 | 
						|
what  you  name  the
 | 
						|
file  as  long as it is a shared object file.  If you prefer
 | 
						|
to name your shared object files with the extension .o, this
 | 
						|
is fine with POSTGRES so long as you make sure that the correct 
 | 
						|
file name is given to the create function command.   In
 | 
						|
other words, you must simply be consistent.  However, from a
 | 
						|
pragmatic point of view, we discourage this practice because
 | 
						|
you  will undoubtedly confuse yourself with regards to which
 | 
						|
files have been made into shared object files and which have
 | 
						|
not.   For  example, it's very hard to write Makefiles to do
 | 
						|
the link-editing automatically if both the object  file  and
 | 
						|
the shared object file end in .o!<br>
 | 
						|
 | 
						|
<HR>
 | 
						|
<font size=-1>
 | 
						|
<A HREF="pg95user.html">[ TOC ]</A> 
 | 
						|
<A HREF="refs.html">[ Previous ]</A> 
 | 
						|
[ Next ] 
 | 
						|
</font>
 | 
						|
</BODY>
 | 
						|
</HTML>
 |