Maintenance of software requires an
ability to understand what the current system is doing, and the ability
to change the system and deploy a new, and hopefully better, version.
Towards these ends, the creation of run-time introspective and
manipulative mechanisms has been researched and practiced heavily.
While new languages (such as Java) and new frameworks (such as J2EE and
.NET) offer some opportunity to provide these services, there is still
much software running on legacy platforms, and much software still
being created for these platforms.
Dynamic link libraries, also called shared libraries, delay the binding
of externally needed symbols (functions, methods, global data) to the
runtime of the program. An extra module, the dynamic linker, is loaded
with the program, and accomplishes the dynamic linking necessary for
the program to complete its execution. In this sense, the dynamic link
library platform offers a potential foundation for building a true
component-based software system framework.
It also is a natural place to allow introspection and manipulation to
occur. Since symbols are not yet bound, a dynamic linker could allow a
tool builder access to the binding operation, and allow the tool to
take a variety of actions. Inserting wrappers for tracing, security,
assertion checks, and many other uses ought to be possible. Redirecting
a binding to another symbol should be supported. Finally, run-time
modification of bindings should be possible. All of this is feasible
without any modification or translation of the object code of the
application.
DDL is a framework of modifications and extensions to the dynamic
linker that allow us to have dynamic control over the linking process,
and to implement the full range of desired features listed above. DDL
allows powerful control over the linking process, enables the easy
construction of runtime monitoring tools, and supports the runtime
evolution of dynamically linked programs. DDL is a modification of the
GNU dynamic loader, which is part of the GNU C library. Our current
tests have only been on the GNU/Linux platform, although the GNU
libraries (and the dynamic linker) are ported to many other platform.