libdl.tex 3.19 KB
Newer Older
1 2 3 4
\section{\module{dl} ---
         Call C functions in shared objects}
\declaremodule{extension}{dl}
  \platform{Unix} %?????????? Anyone????????????
5
\sectionauthor{Moshe Zadka}{moshez@zadka.site.co.il}
6 7 8 9 10
\modulesynopsis{Call C functions in shared objects.}

The \module{dl} module defines an interface to the
\cfunction{dlopen()} function, which is the most common interface on
\UNIX{} platforms for handling dynamically linked libraries. It allows
11
the program to call arbitrary functions in such a library.
12

13 14
\note{This module will not work unless
\code{sizeof(int) == sizeof(long) == sizeof(char *)}
15
If this is not the case, \exception{SystemError} will be raised on
16
import.}
17 18 19 20 21 22 23

The \module{dl} module defines the following function:

\begin{funcdesc}{open}{name\optional{, mode\code{ = RTLD_LAZY}}}
Open a shared object file, and return a handle. Mode
signifies late binding (\constant{RTLD_LAZY}) or immediate binding
(\constant{RTLD_NOW}). Default is \constant{RTLD_LAZY}. Note that some
24
systems do not support \constant{RTLD_NOW}.
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44

Return value is a \pytype{dlobject}.
\end{funcdesc}

The \module{dl} module defines the following constants:

\begin{datadesc}{RTLD_LAZY}
Useful as an argument to \function{open()}.
\end{datadesc}

\begin{datadesc}{RTLD_NOW}
Useful as an argument to \function{open()}.  Note that on systems
which do not support immediate binding, this constant will not appear
in the module. For maximum portability, use \function{hasattr()} to
determine if the system supports immediate binding.
\end{datadesc}

The \module{dl} module defines the following exception:

\begin{excdesc}{error}
45
Exception raised when an error has occurred inside the dynamic loading
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
and linking routines.
\end{excdesc}

Example:

\begin{verbatim}
>>> import dl, time
>>> a=dl.open('/lib/libc.so.6')
>>> a.call('time'), time.time()
(929723914, 929723914.498)
\end{verbatim}

This example was tried on a Debian GNU/Linux system, and is a good
example of the fact that using this module is usually a bad alternative.

\subsection{Dl Objects \label{dl-objects}}

Dl objects, as returned by \function{open()} above, have the
following methods:

\begin{methoddesc}{close}{}
Free all resources, except the memory.
\end{methoddesc}

\begin{methoddesc}{sym}{name}
Return the pointer for the function named \var{name}, as a number, if
it exists in the referenced shared object, otherwise \code{None}. This
is useful in code like:

\begin{verbatim}
>>> if a.sym('time'): 
...     a.call('time')
... else: 
...     time.time()
\end{verbatim}

(Note that this function will return a non-zero number, as zero is the
\NULL{} pointer)
\end{methoddesc}

\begin{methoddesc}{call}{name\optional{, arg1\optional{, arg2\ldots}}}
Call the function named \var{name} in the referenced shared object.
The arguments must be either Python integers, which will be 
passed as is, Python strings, to which a pointer will be passed, 
90
or \code{None}, which will be passed as \NULL.  Note that 
91 92 93 94 95 96 97
strings should only be passed to functions as \ctype{const char*}, as
Python will not like its string mutated.

There must be at most 10 arguments, and arguments not given will be
treated as \code{None}. The function's return value must be a C
\ctype{long}, which is a Python integer.
\end{methoddesc}