annotate doc/manual/manual_dynload_api.tex @ 457:90b1d927912a

- suite_aggrs: make sure random memory used doesn't ever result in NaN fp values (for every possible address), as this messes with result comparison
author Tassilo Philipp
date Fri, 28 Jan 2022 14:11:21 +0100
parents 8b0fc583ce62
children b47168dacba6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
1 %//////////////////////////////////////////////////////////////////////////////
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
2 %
228
f8a6e60598cc - completed dynload API doc
Tassilo Philipp
parents: 0
diff changeset
3 % Copyright (c) 2007-2017 Daniel Adler <dadler@uni-goettingen.de>,
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
4 % Tassilo Philipp <tphilipp@potion-studios.com>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
5 %
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 % Permission to use, copy, modify, and distribute this software for any
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
7 % purpose with or without fee is hereby granted, provided that the above
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
8 % copyright notice and this permission notice appear in all copies.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
9 %
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
10 % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
11 % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
12 % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
13 % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
14 % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
15 % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
16 % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
17 %
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
18 %//////////////////////////////////////////////////////////////////////////////
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
19
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
20 \newpage
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
21 \section{\product{Dynload} C library API}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
22
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
23 The \product{dynload} library encapsulates dynamic loading mechanisms and
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
24 gives access to functions in foreign dynamic libraries and code modules.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
25
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
26 \subsection{Loading code}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
27
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
28 \begin{lstlisting}[language=c,label=dl-load]
228
f8a6e60598cc - completed dynload API doc
Tassilo Philipp
parents: 0
diff changeset
29 DLLib* dlLoadLibrary(const char* libpath);
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30 void dlFreeLibrary(void* libhandle);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31 \end{lstlisting}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33 \lstinline{dlLoadLibrary} loads a dynamic library at \lstinline{libpath}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34 and returns a handle to it for use in \lstinline{dlFreeLibrary} and
243
2a77747a5496 dynload doc:
Tassilo Philipp
parents: 228
diff changeset
35 \lstinline{dlFindSymbol} calls. Passing a null pointer for the \lstinline{libpath}
2a77747a5496 dynload doc:
Tassilo Philipp
parents: 228
diff changeset
36 argument is valid, and returns a handle to the main executable of the calling code.
2a77747a5496 dynload doc:
Tassilo Philipp
parents: 228
diff changeset
37 Also, searching libraries in library paths (e.g. by just passing the library's leaf
2a77747a5496 dynload doc:
Tassilo Philipp
parents: 228
diff changeset
38 name) should work, however, they are OS specific. Returns a null pointer on error.
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
40 \lstinline{dlFreeLibrary} frees the loaded library with handle \lstinline{pLib}.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
41
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
42 \subsection{Retrieving functions}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
43
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
44 \begin{lstlisting}[language=c]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45 void* dlFindSymbol(void* libhandle, const char* symbol);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46 \end{lstlisting}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47
228
f8a6e60598cc - completed dynload API doc
Tassilo Philipp
parents: 0
diff changeset
48 This function returns a pointer to a symbol with name \lstinline{pSymbolName} in the
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49 library with handle \lstinline{pLib}, or returns a null pointer if the symbol cannot
228
f8a6e60598cc - completed dynload API doc
Tassilo Philipp
parents: 0
diff changeset
50 be found. The name is specified as it would appear in C source code (mangled if C++, etc.).
f8a6e60598cc - completed dynload API doc
Tassilo Philipp
parents: 0
diff changeset
51
243
2a77747a5496 dynload doc:
Tassilo Philipp
parents: 228
diff changeset
52 \subsection{Misc functions}
2a77747a5496 dynload doc:
Tassilo Philipp
parents: 228
diff changeset
53 \begin{lstlisting}[language=c]
2a77747a5496 dynload doc:
Tassilo Philipp
parents: 228
diff changeset
54 int dlGetLibraryPath(DLLib* pLib, char* sOut, int bufSize);
2a77747a5496 dynload doc:
Tassilo Philipp
parents: 228
diff changeset
55 \end{lstlisting}
2a77747a5496 dynload doc:
Tassilo Philipp
parents: 228
diff changeset
56
2a77747a5496 dynload doc:
Tassilo Philipp
parents: 228
diff changeset
57 This function can be used to get a copy of the path to the library loaded with handle
2a77747a5496 dynload doc:
Tassilo Philipp
parents: 228
diff changeset
58 \lstinline{pLib}. The parameter \lstinline{sOut} is a pointer to a buffer of size
2a77747a5496 dynload doc:
Tassilo Philipp
parents: 228
diff changeset
59 \lstinline{bufSize} (in bytes), to hold the output string. The return value is the size
2a77747a5496 dynload doc:
Tassilo Philipp
parents: 228
diff changeset
60 of the buffer (in bytes) needed to hold the null-terminated string, or 0 if it can't be
329
8b0fc583ce62 - tex formatting fix
Tassilo Philipp
parents: 248
diff changeset
61 looked up. If \lstinline{bufSize} \textgreater= return value \textgreater 1, a null-terminted string with the
248
ab23f9f2934a - BeOS impl for dlGetLibraryPath
Tassilo Philipp
parents: 243
diff changeset
62 path to the library should be in \lstinline{sOut}. If it returns 0, the library name wasn't
ab23f9f2934a - BeOS impl for dlGetLibraryPath
Tassilo Philipp
parents: 243
diff changeset
63 able to be found. Please note that this might happen in some rare cases, so make sure to always check.
243
2a77747a5496 dynload doc:
Tassilo Philipp
parents: 228
diff changeset
64
228
f8a6e60598cc - completed dynload API doc
Tassilo Philipp
parents: 0
diff changeset
65 \subsection{Symbol iteration}
f8a6e60598cc - completed dynload API doc
Tassilo Philipp
parents: 0
diff changeset
66
f8a6e60598cc - completed dynload API doc
Tassilo Philipp
parents: 0
diff changeset
67 \begin{lstlisting}[language=c]
f8a6e60598cc - completed dynload API doc
Tassilo Philipp
parents: 0
diff changeset
68 DLSyms* dlSymsInit(const char* libPath);
f8a6e60598cc - completed dynload API doc
Tassilo Philipp
parents: 0
diff changeset
69 void dlSymsCleanup(DLSyms* pSyms);
f8a6e60598cc - completed dynload API doc
Tassilo Philipp
parents: 0
diff changeset
70 int dlSymsCount(DLSyms* pSyms);
f8a6e60598cc - completed dynload API doc
Tassilo Philipp
parents: 0
diff changeset
71 const char* dlSymsName(DLSyms* pSyms, int index);
f8a6e60598cc - completed dynload API doc
Tassilo Philipp
parents: 0
diff changeset
72 const char* dlSymsNameFromValue(DLSyms* pSyms, void* value); /* symbol must be loaded */
f8a6e60598cc - completed dynload API doc
Tassilo Philipp
parents: 0
diff changeset
73 \end{lstlisting}
f8a6e60598cc - completed dynload API doc
Tassilo Philipp
parents: 0
diff changeset
74
243
2a77747a5496 dynload doc:
Tassilo Philipp
parents: 228
diff changeset
75
2a77747a5496 dynload doc:
Tassilo Philipp
parents: 228
diff changeset
76 These functions can be used to iterate over symbols. Since they can be used on libraries that are not linked, they are made
228
f8a6e60598cc - completed dynload API doc
Tassilo Philipp
parents: 0
diff changeset
77 for symbol name lookups, not to get a symbol's address. For that refer to
f8a6e60598cc - completed dynload API doc
Tassilo Philipp
parents: 0
diff changeset
78 \lstinline{dlFindSymbol}. \lstinline{dlSymsInit} will return a handle (or a null pointer
243
2a77747a5496 dynload doc:
Tassilo Philipp
parents: 228
diff changeset
79 on error) to the shared object specified by \lstinline{libPath}, to be used with the other dlSyms* functions. Note that contrary
2a77747a5496 dynload doc:
Tassilo Philipp
parents: 228
diff changeset
80 to loading and linking libraries, no (OS-specific) rules for searching libraries in library paths, etc. apply. The handle must be freed with
228
f8a6e60598cc - completed dynload API doc
Tassilo Philipp
parents: 0
diff changeset
81 \lstinline{dlSymsCleanup}. \lstinline{dlSymsCount} returns the number of
f8a6e60598cc - completed dynload API doc
Tassilo Philipp
parents: 0
diff changeset
82 symbols in the shared object, \lstinline{dlSymsName} and \lstinline{dlSymsNameFromValue}
f8a6e60598cc - completed dynload API doc
Tassilo Philipp
parents: 0
diff changeset
83 are used to lookup symbol names using an index or symbol's address, respectively,
f8a6e60598cc - completed dynload API doc
Tassilo Philipp
parents: 0
diff changeset
84 returning a null pointer on error. The names are returned as they would appear
f8a6e60598cc - completed dynload API doc
Tassilo Philipp
parents: 0
diff changeset
85 in C source code (mangled if C++, etc.). The address passed to \lstinline{dlSymsNameFromValue}
f8a6e60598cc - completed dynload API doc
Tassilo Philipp
parents: 0
diff changeset
86 must point to a loaded symbol.
f8a6e60598cc - completed dynload API doc
Tassilo Philipp
parents: 0
diff changeset
87