| この記事の要点 |
|
概要
.dll(Dynamic Link Library)は、Windows 上で複数のプログラムが共有して使う関数群やリソースをまとめたバイナリファイルです。たとえば kernel32.dll(Windows API の基盤)、user32.dll(ウィンドウ・メッセージ)、gdi32.dll(描画)といった OS の中核も DLL として提供されており、すべての Windows アプリは何らかの DLL に依存しています。
DLL の最大のメリットは コードの共有とメモリ効率です。10 個のアプリが同じ機能を必要としても、それぞれが同じコードを抱える代わりに 1 つの DLL を読み込めば、ディスク容量もメモリ使用量も大幅に節約できます。さらに DLL を差し替えるだけでバグ修正や機能追加ができ、アプリ本体(.exe)を再ビルドしなくて済みます。
一方で、依存する DLL が見つからない、バージョンが合わない、悪意ある DLL に差し替えられる、といった 「DLL 地獄」とも呼ばれる問題も発生しやすく、Windows の歴史は DLL 管理の試行錯誤の歴史でもあります。
内部構造
DLL のファイル構造は基本的に .exe と同じ PE 形式です。先頭の 4D 5A(MZ)ヘッダ、PE シグネチャ、COFF ヘッダ、オプショナルヘッダ、セクションテーブルという順序は同一で、違いは以下の点に集約されます。
- Characteristics フラグ: COFF ヘッダの
IMAGE_FILE_DLLビットが立っている。これにより OS は「単独起動不可、ライブラリとしてロード」と判断する - エクスポートテーブル(.edata): 他プログラムから呼び出せる関数名・序数(ordinal)・アドレスの対応表。
__declspec(dllexport)や DEF ファイルで指定する - エントリポイント:
DllMain。DLL_PROCESS_ATTACH/DLL_PROCESS_DETACH等の通知を受ける - リソースセクション(.rsrc): アイコン、ダイアログ、文字列テーブル等。リソース専用 DLL も存在する
呼び出し側は次のいずれかでロードします。
- 暗黙的リンク(静的インポート): ビルド時に .lib(インポートライブラリ)をリンクし、.exe の IAT(Import Address Table)に DLL 名と関数名が記録される。起動時に OS が自動ロード
- 明示的リンク(動的ロード):
HMODULE h = LoadLibrary(L"foo.dll");→FARPROC p = GetProcAddress(h, "Bar");→FreeLibrary(h);
主な用途
- OS の API 提供: kernel32 / user32 / advapi32 / ntdll など Windows 自身のサブシステム
- ランタイムライブラリ:
msvcr*.dll(C ランタイム)、vcruntime140.dll、.NET のmscoree.dll - サードパーティライブラリ: Qt、OpenSSL、ffmpeg、zlib などの再配布パッケージ
- プラグイン機構: Photoshop プラグイン、VST、Excel アドイン、ゲームの MOD などは DLL 形式で提供されることが多い
- COM サーバ:
regsvr32 foo.dllでレジストリに登録、CLSID 経由で生成
関連形式との比較
| 形式 | プラットフォーム | 用途 | 備考 |
|---|---|---|---|
| .dll | Windows | 動的ライブラリ | PE 形式、エクスポートテーブル必須 |
| .so | Linux | 共有オブジェクト | ELF 形式、dlopen でロード |
| .dylib | macOS | 動的ライブラリ | Mach-O 形式、dlopen |
| .lib(インポート) | Windows | 静的リンクのスタブ | DLL 名と関数名のみ。実体は持たない |
| .lib(静的) | Windows | 静的ライブラリ | オブジェクトコード本体。.exe に取り込まれる |
| .ocx | Windows | ActiveX コントロール | 実体は DLL |
コマンド・ツール
- dumpbin /exports foo.dll: エクスポート関数一覧を表示
- dumpbin /imports app.exe: その .exe が必要とする DLL と関数を表示
- Dependency Walker(depends.exe): 依存ツリーを GUI で可視化。古典的ツールだが Windows 10 以降は API セット DLL の扱いで誤検知あり
- Dependencies(lucasg/Dependencies): Dependency Walker の現代版後継
- Process Explorer / Process Hacker: 実行中プロセスがロードしている DLL 一覧
- regsvr32 / regsvr32 /u: COM DLL の登録・解除
- sxstrace.exe: Side-by-side アセンブリのロードエラー解析
注意点
- DLL Hijacking(DLL Search Order Hijacking):
LoadLibraryに絶対パスを与えないと、OS は決められた検索順(アプリディレクトリ → System32 → カレント → PATH)でロードする。攻撃者が同名 DLL を仕込むと乗っ取られる。対策はSetDefaultDllDirectoriesやLoadLibraryExのフラグ、KnownDLLs 機構 - 32bit / 64bit の混在不可: 64bit .exe は 64bit DLL しかロードできない。プロセス内で混ぜることはできない
- バージョン不整合: 同名異バージョンの DLL が複数存在すると問題が起きる。Side-by-side(WinSxS)/ マニフェスト / アプリローカル配置で解決
- 循環依存と DllMain:
DllMain内で別 DLL をLoadLibraryするとデッドロック・クラッシュの原因。最小限の初期化のみ書く - 削除・上書きの困難さ: ロード中の DLL はロックされて削除できない。再起動や
MoveFileEx+MOVEFILE_DELAY_UNTIL_REBOOTで対応
関連リンク
- 実行ファイル・パッケージ(親カテゴリ)
- ファイル拡張子とは(概論)
- EXE(.exe) — .dll をロードする側
- dll を参照する方法
- 本番環境の dll 内で参照している dll ファイルの置き場所
子ページ
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Git pushした変更の取消し|revert・履歴変更と保護の注意点 2026-10-15 23:49:01
- Gitでローカルを戻す前に|reset・restoreの違いと退避範囲 2026-10-15 23:49:01
- Git rebaseの使い方|対象範囲・競合解決・pushの判断 2026-10-15 22:50:59
- Git pullの使い方|取込み先・ff-only・競合とstashの注意点 2026-10-15 22:50:59
- Git pushの使い方|送信先・タグ・force-with-leaseの条件 2026-10-15 22:12:47
- Git remoteの設定・確認・削除|SSH URLとfetch/pushの違い 2026-10-15 22:12:47
- Gitリモートリポジトリの作成|初回push・既存履歴・mirrorの注意 2026-10-15 15:48:16
- Gitのuser.name・user.email設定|local/global・確認と過去履歴の注意 2026-10-15 15:30:07
- LinuxにGitをインストール|配布元・初期設定・TLSと認証の確認 2026-10-15 15:30:06
- Git導入と初回push|Linuxサーバー・Windows/macOS・SSH設定 2026-10-15 14:51:54
- Db2のCREATE INDEX|索引定義・INCLUDEと実行計画の確認 2026-10-15 14:10:22
- Db2の自動採番|IDENTITY・ID取得とRESTARTの注意点 2026-10-15 14:10:22
- 【DB2】特定スキーマの全テーブルの全カラム情報を取得する方法 2026-10-15 13:53:15
- Db2のシーケンスとIDENTITYの違い|採番とカタログの確認SQL 2026-10-15 13:53:15
- Db2で複数カラムをUPDATEする方法|SET・WHEREと更新前の値 2026-10-15 13:53:15