FlexDLL: an implementation of a dlopen-like API for Windows
Under Windows, DLL (Dynamically-Linked
Libraries) are generally used to improve code
modularity and sharing. A DLL can be loaded automatically when the
program is loaded (if it requires the DLL). The program can also
explicitly request Windows to load a DLL at any moment during runtime,
function from the Win32 API.
This naturally suggests to use DLLs as a plugin mechanism. For instance, a web server could load extensions modules stored in DLLs at runtime. But Windows does not really make it easy to implement plugins that way. The reason is that when you try to create a DLL from a set of object files, the linker needs to resolve all the symbols, which leads to the very problem solved by FlexDLL:
Windows DLL cannot refer to symbols defined in the main application or in previously loaded DLLs.
Some usual solutions exist, but they are not very flexible. A notable exception is the edll library (its homepage also describes the usual solutions), which follows a rather drastic approach; indeed, edll implements a new dynamic linker which can directly load object files (without creating a Windows DLL).
FlexDLL is another solution to the same problem. Contrary
to edll, it relies on the native static and dynamic
linkers. Also, it works both with the Microsoft environment (MS
linker, Visual Studio compilers) and with Cygwin (GNU linker and
compilers, in Cygwin or MinGW mode). Actually, FlexDLL implements
mostly the usual
POSIX API, without trying to be fully conformant though (e.g. it does
not respect the official priority ordering for symbol
resolution). This should make it easy to port applications developped
FlexDLL is distributed under the terms of a zlib/libpng open source license. The copyright holder is the Institut National de Recherche en Informatique et en Automatique (INRIA). The project was started when I (= Alain Frisch) was working at INRIA. I'm now working for LexiFi, which is kind enough to let me continue my work on FlexDLL. My office mate at INRIA, Jean-Baptiste Tristan, coined the name FlexDLL.
The runtime support library is written in C. The
flexlink wrapper is implemented in the wonderful
Objective Caml language.
MSVC: the 32-bit C compiler from Microsoft.
MSVC64: the 64-bit C compiler from Microsoft.
CYGWIN: the 32-bit gcc compiler shipped with Cygwin.
MINGW: the 32-bit gcc compiler from the Mingw64 project, packaged in Cygwin (as i686-w64-mingw32-gcc).
MINGW64: the 64-bit gcc compiler from the Mingw64 project, packaged in Cygwin (as x86_64-w64-mingw32-gcc).
LD: an internal linker to produce .dll (only).