summaryrefslogtreecommitdiffstats
path: root/Doc/lib
diff options
context:
space:
mode:
authorFred Drake <fdrake@acm.org>1999-07-01 20:40:21 (GMT)
committerFred Drake <fdrake@acm.org>1999-07-01 20:40:21 (GMT)
commit4c8d83f311396e49bf0857c7f068ebb40c918751 (patch)
treeee286df6977ef8945f0631bf2f590eccd5708d04 /Doc/lib
parent44a7a7c5d0ddda96fbf2efb9c22fe1858a0b5849 (diff)
downloadcpython-4c8d83f311396e49bf0857c7f068ebb40c918751.zip
cpython-4c8d83f311396e49bf0857c7f068ebb40c918751.tar.gz
cpython-4c8d83f311396e49bf0857c7f068ebb40c918751.tar.bz2
Documentation for dl module from Moshe.
Diffstat (limited to 'Doc/lib')
-rw-r--r--Doc/lib/libdl.tex99
1 files changed, 99 insertions, 0 deletions
diff --git a/Doc/lib/libdl.tex b/Doc/lib/libdl.tex
new file mode 100644
index 0000000..31a3793
--- /dev/null
+++ b/Doc/lib/libdl.tex
@@ -0,0 +1,99 @@
+\section{\module{dl} ---
+ Call C functions in shared objects}
+\declaremodule{extension}{dl}
+ \platform{Unix} %?????????? Anyone????????????
+\sectionauthor{Moshe Zadka}{mzadka@geocities.com}
+\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
+the program to call arbitary functions in such a library.
+
+\strong{Note:} This module will not work unless
+\begin{verbatim}
+sizeof(int) == sizeof(long) == sizeof(char *)
+\end{verbatim}
+If this is not the case, \exception{SystemError} will be raised on
+import.
+
+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
+sytems do not support \constant{RTLD_NOW}.
+
+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}
+Exception raised when an error has occured inside the dynamic loading
+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,
+or \code{None}, which will be passed as \NULL{}. Note that
+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}