What Are DLL Imports and Exports? — illustrated DLL guide thumbnail

What Are DLL Imports and Exports?

DLL imports and exports describe how Windows binaries connect to each other. Imports are the external libraries and functions a DLL expects to use. Exports are the functions or symbols a DLL makes available to other software.

Together, they explain much of the relationship between an application and its libraries.

This guide explains DLL imports and exports, how the import and export tables work, what names and ordinals mean, and how these structures help with troubleshooting and static DLL analysis.

Quick answer

Imports tell you what a DLL needs from other modules. Exports tell you what the DLL offers to other modules. Both can be inspected without running the file.

On this page

Imports vs Exports at a Glance

Feature Imports Exports
Meaning Functions and DLLs the binary depends on Functions or symbols the binary exposes
Main PE structure Import directory Export directory
Typical use Dependency analysis Public API analysis
Can use names? Yes Yes
Can use ordinals? Yes Yes

What Is a DLL Import?

An import is a function or symbol that the current binary expects another module to provide.

For example, a DLL may need Windows APIs for file access, memory allocation, or user-interface work.

Imports from KERNEL32.dll: CreateFileW ReadFile CloseHandle Imports from USER32.dll: MessageBoxW

This tells you that the DLL expects those functions to be available when loaded.

What Is a DLL Export?

An export is a function, variable, or symbol a DLL makes available to callers.

For example:

Exports: InitializeEngine ProcessData GetVersion ShutdownEngine

Another program can call those exported functions if it knows the names or ordinals and uses the correct calling convention and parameters.

A Simple Mental Model

Think of a DLL as a small service counter.

Imports = what the DLL orders
The DLL asks other libraries for functions it needs.
Exports = what the DLL offers
Other software asks this DLL for functions it exposes.

Where Are Imports Stored?

Windows PE files can contain an Import Directory.

This directory points to structures describing imported DLL names and imported functions.

At a high level, the import information answers two questions:

  • Which DLLs does this binary depend on?
  • Which functions does it need from each DLL?

For a more focused guide, read How to View DLL Imports and Dependencies.

Where Are Exports Stored?

Exports are described by the PE Export Directory.

The export table can contain:

  • Exported function addresses
  • Exported names
  • Ordinals
  • Forwarded exports

This data lets other software locate functions that the DLL intentionally makes public.

What Is the Import Address Table?

The Import Address Table, often shortened to IAT, is an important part of Windows DLL loading.

Before the binary runs normally, Windows resolves imported functions and places their addresses into slots the program can use.

IAT slot for CreateFileW → resolved address in KERNEL32.dll IAT slot for MessageBoxW → resolved address in USER32.dll

The program can then call through those resolved addresses.

What Is the Export Address Table?

The Export Address Table is part of the export-directory structure.

It maps export ordinals to RVAs that identify where exported code or forwarded targets are located.

Names, ordinals, and function addresses work together to let a caller resolve an export.

Named Exports

A named export is the easiest kind to understand.

Example:

GetVersion InitializePlugin ProcessFrame

A caller can look up the function by that name.

This makes troubleshooting easier because an error message can tell you exactly which procedure is missing.

Ordinal Exports

An export can also be identified by an ordinal number.

Ordinal 1 Ordinal 2 Ordinal 7

Ordinals are compact and can be stable if the developer controls them carefully.

But they are harder for humans to understand because the number alone does not describe the function’s purpose.

Can a Function Be Exported by Both Name and Ordinal?

Yes.

A DLL can expose a function with a readable name while also assigning it an ordinal.

That lets callers resolve it either way, depending on how the API is designed.

What Are Forwarded Exports?

A forwarded export does not point directly to code inside the current DLL.

Instead, it points to an export in another DLL.

Conceptually:

Current DLL export: FunctionA Forwarded to: OTHERDLL.FunctionB

This lets one DLL expose an API that is actually implemented elsewhere.

Static Imports vs Dynamic Loading

The normal import table does not always show every DLL a program can load.

Software can load libraries dynamically at runtime using APIs such as LoadLibrary and resolve functions with GetProcAddress.

Static import: Declared in PE import table Dynamic import: Library name and function resolved later at runtime

This is why static imports are useful but not a complete list of every possible dependency.

Delay-Loaded Imports

Some Windows binaries use delay loading.

Instead of resolving a DLL immediately during normal startup, the application can defer loading until a function is actually needed.

Delay-load information is stored separately from the ordinary import directory.

A dependency viewer that understands PE delay imports can show these too.

Why Imports Matter for Troubleshooting

Imports are useful when Windows says a DLL cannot be loaded.

Imagine:

plugin.dll exists plugin.dll imports: KERNEL32.dll VCRUNTIME140.dll vendor_runtime.dll

If vendor_runtime.dll is missing, Windows may fail while loading plugin.dll.

The top-level DLL is present, but its dependency chain is incomplete.

Why Exports Matter for Troubleshooting

Exports are especially important when an application reports:

The procedure entry point ProcessDataV2 could not be located…

That means the caller expected a function the loaded DLL does not expose under the expected name or ordinal.

For this error, read “Entry Point Not Found” DLL Error: Causes and Fixes.

Imports Do Not Tell You What the DLL Definitely Does

An imported API is only evidence that the binary may use that function.

It does not tell you:

  • When the function is called
  • How often it is called
  • What parameters are used
  • Whether a particular code path is reached

Imports are useful context, not a full behavior trace.

Exports Do Not Reveal Every Internal Function

The export table only shows the public interface.

A DLL can contain hundreds or thousands of internal functions that are not exported.

Those functions may still be used internally by the DLL but remain invisible in the export table.

Native DLL Exports vs .NET Methods

Native PE exports and managed .NET public methods are different concepts.

A normal .NET class library may expose public classes and methods through CLR metadata without listing those methods in the traditional native PE export table.

Type Public interface usually found in
Native DLL PE export table
.NET DLL CLR metadata, types, methods, assemblies

See Native DLL vs .NET DLL: What Is the Difference?.

Can a DLL Have No Exports?

Yes.

Some DLLs exist primarily for internal loading, resources, managed assemblies, COM behavior, or other mechanisms.

A DLL with no traditional named exports is not automatically broken.

Can a DLL Have No Imports?

Yes.

A very small or unusual DLL can have few or no normal static imports.

It may resolve functions dynamically, contain self-contained code, or use a different loading model.

So an empty import table is not automatically suspicious or invalid.

C++ Export Names Can Look Strange

C++ compilers may decorate function names to encode type information and calling conventions.

You may see exports like:

?ProcessData@@YAHPEAXH@Z

This is normal for many C++ binaries.

Developers often use C-style exports when they want a simpler stable external API.

Imports and Exports During DLL Loading

A simplified native load sequence looks like this:

Locate DLL

Validate PE image

Map sections

Resolve imports

Apply relocations if needed

Run initialization

Caller can use exported API

If imports cannot be resolved, loading can fail before the application’s normal use of exports begins.

How to Inspect DLL Imports and Exports Safely

You do not need to execute a DLL to view its normal import and export tables.

A static PE viewer can read both directly from the file.

Useful information to record includes:

  • Imported DLL names
  • Imported function names
  • Imported ordinals
  • Exported function names
  • Export ordinals
  • Forwarded exports

A Practical Example

Imagine a DLL named imageengine.dll.

Imports: KERNEL32.dll → CreateFileW KERNEL32.dll → ReadFile GDI32.dll → CreateBitmap Exports: InitializeImageEngine DecodeImage GetImageSize ShutdownImageEngine

From static analysis alone, you can reasonably say that the DLL depends on Windows file and graphics APIs and exposes an image-processing style API.

You still cannot determine every runtime behavior from these tables alone.

Frequently Asked Questions

What are DLL imports?

Imports are external functions and libraries a DLL expects to use.

What are DLL exports?

Exports are functions or symbols a DLL makes available to other software.

Can imports use ordinals?

Yes. Imports can be resolved by function name or ordinal.

Can exports use ordinals?

Yes. A DLL can export by name, ordinal, or both.

Do imports show every DLL loaded at runtime?

No. Dynamically loaded libraries may not appear in the normal import table.

Can I view imports and exports without running the DLL?

Yes. A static PE viewer can read both tables directly from the file.

The Key Difference Between DLL Imports and Exports

Imports describe dependencies. Exports describe the public interface.

If you are troubleshooting a missing dependency, start with imports. If you are troubleshooting an “Entry Point Not Found” error, start with exports.

Together, these two PE structures are among the most useful parts of a DLL for static analysis.

View DLL imports and exports online

Inspect dependencies, exported functions, architecture, PE sections, SHA-256, and basic .NET indicators without executing the DLL.

View DLL Imports and Exports

Further reading

Microsoft: PE format specification

Similar Posts