Sie sind auf Seite 1von 11

Dynamic Link Library

DLL
Dynamic-link library or DLL, is Microsoft's
implementation of the shared library concept in the
Microsoft Windows and OS/2 operating systems. These
libraries usually have the file extension DLL, OCX (for
libraries containing ActiveX controls), or DRV (for
legacy system drivers). The file formats for DLLs are the
same as for Windows EXE files — that is, Portable
Executable (PE) for 32-bit and 64-bit Windows, and New
Executable (NE) for 16-bit Windows. As with EXEs,
DLLs can contain code, data, and resources, in any
combination.
Background
All Operating-System level operations were provided by the
underlying operating system: DOS. All higher level services
were provided by Windows Libraries Dynamic Link
Libraries. The drawing API, GDI was implemented in a DLL
called GDI.EXE, the user interface in USER.EXE.

The Graphics Device Interface code in GDI needed to


translate drawing commands to operations on specific
devices. On the display, it had to manipulate pixels in the
frame buffer. When drawing to a printer, the API calls had to
be transformed into requests to a printer.
Background Contd…
The same architectural concept that allowed GDI to load
different device drivers is that which allowed the Windows
shell to load different windows programs, and for these
programs to invoke API calls from the shared USER and GDI
libraries. That concept was Dynamic Linking.

In a conventional non-shared, static library, sections of code


are simply added to the calling program when its executable is
built at the linking phase; if two programs use the same
routine, the code has to be included in both. With dynamic
linking shared code is placed into a single, separate file.
DLL Benefits
DLLs provide the standard benefits of shared libraries, such as
modularity. Modularity allows changes to be made to code and
data in a single self-contained DLL shared by several
applications without any change to the applications themselves.
Another benefit of the modularity is the use of generic
interfaces for plug-ins. A single interface may be developed
which allows old as well as new modules to be integrated
seamlessly at run-time into pre-existing applications, without
any modification to the application itself.
Features of DLL
• Memory Management
• Import Libraries
• Symbol resolution and binding
• Explicit run-time linking
Memory Management
•In Win32, the DLL files are organized into sections. Code Section and Data Section - Each
section has its own set of attributes, such as being writable or read-only, executable (for code)
or non-executable (for data), and so on.

•The code in a DLL is usually shared among all the processes that use the DLL; that is, they
occupy a single place in physical memory, and do not take up space in the page file.

•Data sections of a DLL are usually private; that is, each process using the DLL has its own
copy of all the DLL's data. Optionally, data sections can be made shared, allowing inter-process
communication via this shared memory area. However, because user restrictions do not apply to
the use of shared DLL memory, this creates a security hole; namely, one process can corrupt the
shared data, which will likely cause all other sharing processes to behave undesirably.

•DLLs with shared data sections should not be compressed if they are intended to be used
simultaneously by multiple programs, since each program instance would have to carry its own
copy of the DLL, resulting in increased memory consumption.
Import Libraries
•Static and Dynamic Libraries

•Linking to dynamic libraries is usually handled by linking to an import library


when building or linking to create an executable file. The created executable then
contains an import address table (IAT) by which all DLL function calls are
referenced. At run-time, the IAT is filled with appropriate addresses that point
directly to a function in the separately-loaded DLL.

•Like static libraries, import libraries for DLLs are noted by the .lib file extension.
For example, kernel32.dll, the primary dynamic library for Windows' base functions
such as file creation and memory management, is linked via kernel32.lib.
Symbol resolution and binding
•Each function exported by a DLL is identified by a numeric ordinal and optionally a name.
Likewise, functions can be imported from a DLL either by ordinal or by name. For most Windows
API functions only the names are preserved across different Windows releases; the ordinals are
subject to change. Thus, one cannot reliably import Windows API functions by their ordinals.

•Importing functions by ordinal provides only slightly better performance than importing them by
name: export tables of DLLs are ordered by name, so a binary search can be used to find a function.
The index of the found name is then used to lookup the ordinal in the Export Ordinal table.

•It is also possible to bind an executable to a specific version of a DLL, that is, to resolve the
addresses of imported functions at compile-time. For bound imports, the linker saves the timestamp
and checksum of the DLL to which the import is bound. At run-time Windows checks to see if the
same version of library is being used, and if so, Windows bypasses processing the imports.

•Bound executables load somewhat faster if they are run in the same environment that they were
compiled for, and exactly the same time if they are run in a different environment, so there's no
drawback for binding the imports.
Explicit run-time linking
DLL files may be explicitly loaded at run-time, a process referred to simply as run-time
dynamic linking by Microsoft, by using the LoadLibrary (or LoadLibraryEx) API
function. The GetProcAddress API function is used to lookup exported symbols by name,
and FreeLibrary — to unload the DLL.

With implicit run-time linking, referred to as load-time dynamic linking by Microsoft, if


the linked DLL file cannot be found, Windows will display an error message and fail to
load the application. The application developer cannot handle the absence of DLL files
linked implicitly by the compile-time linker.
DLL Issues
• Loading issues
• Portability
• OS/Platform Dependency
• Complexity of creating DLL’s

Das könnte Ihnen auch gefallen