263 lines
5.3 KiB
HTML
263 lines
5.3 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
|
<HTML
|
|
><HEAD
|
|
><TITLE
|
|
>The Problem</TITLE
|
|
><META
|
|
NAME="GENERATOR"
|
|
CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK
|
|
REL="HOME"
|
|
TITLE="C++ dlopen mini HOWTO"
|
|
HREF="index.html"><LINK
|
|
REL="PREVIOUS"
|
|
TITLE="Introduction"
|
|
HREF="intro.html"><LINK
|
|
REL="NEXT"
|
|
TITLE="The Solution"
|
|
HREF="thesolution.html"></HEAD
|
|
><BODY
|
|
CLASS="section"
|
|
BGCOLOR="#FFFFFF"
|
|
TEXT="#000000"
|
|
LINK="#0000FF"
|
|
VLINK="#840084"
|
|
ALINK="#0000FF"
|
|
><DIV
|
|
CLASS="NAVHEADER"
|
|
><TABLE
|
|
SUMMARY="Header navigation table"
|
|
WIDTH="100%"
|
|
BORDER="0"
|
|
CELLPADDING="0"
|
|
CELLSPACING="0"
|
|
><TR
|
|
><TH
|
|
COLSPAN="3"
|
|
ALIGN="center"
|
|
>C++ dlopen mini HOWTO</TH
|
|
></TR
|
|
><TR
|
|
><TD
|
|
WIDTH="10%"
|
|
ALIGN="left"
|
|
VALIGN="bottom"
|
|
><A
|
|
HREF="intro.html"
|
|
ACCESSKEY="P"
|
|
>Prev</A
|
|
></TD
|
|
><TD
|
|
WIDTH="80%"
|
|
ALIGN="center"
|
|
VALIGN="bottom"
|
|
></TD
|
|
><TD
|
|
WIDTH="10%"
|
|
ALIGN="right"
|
|
VALIGN="bottom"
|
|
><A
|
|
HREF="thesolution.html"
|
|
ACCESSKEY="N"
|
|
>Next</A
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
><HR
|
|
ALIGN="LEFT"
|
|
WIDTH="100%"></DIV
|
|
><DIV
|
|
CLASS="section"
|
|
><H1
|
|
CLASS="section"
|
|
><A
|
|
NAME="theproblem"
|
|
></A
|
|
>2. The Problem</H1
|
|
><P
|
|
>At some time you might have to load a library (and use its
|
|
functions) at runtime; this happens most often when you are
|
|
writing some kind of plug-in or module architecture for your
|
|
program.</P
|
|
><P
|
|
>In the C language, loading a library is very simple (calling
|
|
<TT
|
|
CLASS="function"
|
|
>dlopen</TT
|
|
>, <TT
|
|
CLASS="function"
|
|
>dlsym</TT
|
|
> and
|
|
<TT
|
|
CLASS="function"
|
|
>dlclose</TT
|
|
> is enough), with C++ this is a bit
|
|
more complicated. The difficulties of loading a C++ library
|
|
dynamically are partially due to <A
|
|
HREF="theproblem.html#mangling"
|
|
>name
|
|
mangling</A
|
|
>, and partially due to the fact that the
|
|
<TT
|
|
CLASS="function"
|
|
>dlopen</TT
|
|
> API was written with C in mind, thus
|
|
not offering a suitable way to load classes.</P
|
|
><P
|
|
>Before explaining how to load libraries in C++, let's better
|
|
analyze the problem by looking at name mangling in more
|
|
detail. I recommend you read the explanation of name mangling,
|
|
even if you're not interested in it because it will help you
|
|
understanding why problems occur and how to solve them.</P
|
|
><DIV
|
|
CLASS="section"
|
|
><H2
|
|
CLASS="section"
|
|
><A
|
|
NAME="mangling"
|
|
></A
|
|
>2.1. Name Mangling</H2
|
|
><P
|
|
>In every C++ program (or library, or object file), all
|
|
non-static functions are represented in the binary file as
|
|
<EM
|
|
>symbols</EM
|
|
>. These symbols are special text
|
|
strings that uniquely identify a function in the program,
|
|
library, or object file.</P
|
|
><P
|
|
>In C, the symbol name is the same as the function name:
|
|
the symbol of <TT
|
|
CLASS="function"
|
|
>strcpy</TT
|
|
> will be
|
|
<TT
|
|
CLASS="computeroutput"
|
|
>strcpy</TT
|
|
>, and so on. This is
|
|
possible because in C no two non-static functions can have the
|
|
same name.</P
|
|
><P
|
|
>Because C++ allows overloading (different functions with
|
|
the same name but different arguments) and has many features C
|
|
does not — like classes, member functions, exception
|
|
specifications — it is not possible to simply use the
|
|
function name as the symbol name. To solve that, C++ uses
|
|
so-called <EM
|
|
>name mangling</EM
|
|
>, which transforms
|
|
the function name and all the necessary information (like the
|
|
number and size of the arguments) into some weird-looking
|
|
string which only the compiler knows about. The mangled name
|
|
of <TT
|
|
CLASS="function"
|
|
>foo</TT
|
|
> might look like
|
|
<TT
|
|
CLASS="computeroutput"
|
|
>foo@4%6^</TT
|
|
>, for example. Or it
|
|
might not even contain the word <SPAN
|
|
CLASS="QUOTE"
|
|
>"foo"</SPAN
|
|
>.</P
|
|
><P
|
|
> One of the problems with name mangling is that the C++
|
|
standard (currently [<SPAN
|
|
CLASS="citation"
|
|
>ISO14882</SPAN
|
|
>]) does not
|
|
define how names have to be mangled; thus every compiler
|
|
mangles names in its own way. Some compilers even change their
|
|
name mangling algorithm between different versions (notably
|
|
g++ 2.x and 3.x). Even if you worked out how your particular
|
|
compiler mangles names (and would thus be able to load
|
|
functions via <TT
|
|
CLASS="function"
|
|
>dlsym</TT
|
|
>), this would most
|
|
probably work with your compiler only, and might already be
|
|
broken with the next version.</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="section"
|
|
><H2
|
|
CLASS="section"
|
|
><A
|
|
NAME="AEN137"
|
|
></A
|
|
>2.2. Classes</H2
|
|
><P
|
|
>Another problem with the <TT
|
|
CLASS="function"
|
|
>dlopen</TT
|
|
> API
|
|
is the fact that it only supports loading
|
|
<EM
|
|
>functions</EM
|
|
>. But in C++ a library often
|
|
exposes a class which you would like to use in your
|
|
program. Obviously, to use that class you need to create an
|
|
instance of it, but that cannot be easily done.</P
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="NAVFOOTER"
|
|
><HR
|
|
ALIGN="LEFT"
|
|
WIDTH="100%"><TABLE
|
|
SUMMARY="Footer navigation table"
|
|
WIDTH="100%"
|
|
BORDER="0"
|
|
CELLPADDING="0"
|
|
CELLSPACING="0"
|
|
><TR
|
|
><TD
|
|
WIDTH="33%"
|
|
ALIGN="left"
|
|
VALIGN="top"
|
|
><A
|
|
HREF="intro.html"
|
|
ACCESSKEY="P"
|
|
>Prev</A
|
|
></TD
|
|
><TD
|
|
WIDTH="34%"
|
|
ALIGN="center"
|
|
VALIGN="top"
|
|
><A
|
|
HREF="index.html"
|
|
ACCESSKEY="H"
|
|
>Home</A
|
|
></TD
|
|
><TD
|
|
WIDTH="33%"
|
|
ALIGN="right"
|
|
VALIGN="top"
|
|
><A
|
|
HREF="thesolution.html"
|
|
ACCESSKEY="N"
|
|
>Next</A
|
|
></TD
|
|
></TR
|
|
><TR
|
|
><TD
|
|
WIDTH="33%"
|
|
ALIGN="left"
|
|
VALIGN="top"
|
|
>Introduction</TD
|
|
><TD
|
|
WIDTH="34%"
|
|
ALIGN="center"
|
|
VALIGN="top"
|
|
> </TD
|
|
><TD
|
|
WIDTH="33%"
|
|
ALIGN="right"
|
|
VALIGN="top"
|
|
>The Solution</TD
|
|
></TR
|
|
></TABLE
|
|
></DIV
|
|
></BODY
|
|
></HTML
|
|
> |