Next: , Previous: windres, Up: Top


13 DLLを構築し使用するのに必要なファイルの作成

ダイナミックリンクライブラリ(DLL)を構築し使用するのに必要なファイルを 作成するために,dlltoolは使用されます.

dlltoolは,DLLをサポートするターゲットに対してのみ役に立つの で,常にバイナリユーティリティの一部として構築されるわけではありません.
     
     dlltool [-d|--input-def def-file-name]
             [-b|--base-file base-file-name]
             [-e|--output-exp exports-file-name]
             [-z|--output-def def-file-name]
             [-l|--output-lib library-file-name]
             [--export-all-symbols] [--no-export-all-symbols]
             [--exclude-symbols list]
             [--no-default-excludes]
             [-S|--as path-to-assembler] [-f|--as-flags options]
             [-D|--dllname name] [-m|--machine machine]
             [-a|--add-indirect] [-U|--add-underscore] [-k|--kill-at]
             [-A|--add-stdcall-alias]
             [-x|--no-idata4] [-c|--no-idata5] [-i|--interwork]
             [-n|--nodelete] [-v|--verbose]
             [-h|--help] [-V|--version]
             [object-file ...]
     

dlltoolは,その入力を読み込み,それは,コマンドラインで指定 されたオブジェクトファイルと,-d-bオプションから成 り立ちます.そして,これらの入力を処理し,-eオプションが指定 されている場合はエクスポートファイルを作成します.-lオプショ ンが指定されている場合は,ライブラリファイルを作成し,-zオプ ションが指定されている場合は,defファイルを作成します.-e-l,そして-zオプションのいずれか,またはすべてを, dlltool の呼び出しに配置することが可能です.

DLLを作成しているとき,DLLのソースファイルとともに,それは三つの他のファ イルが必要です.dlltoolは,これらのファイルの作成を手助けす ることが可能です.

最初のファイルは,DLLからエクスポートされる関数や,DLLがインポートする 関数等を指定する,.defファイルです.これはテキストファイルで, 手動で作成したり,作成するためにdlltool-zオプショ ンを用いて使用したりすることが可能です.この場合,dlltoolは, エクスポートされるように特別に印の付けられたこれらの関数を探しながら, コマンドラインで指定されたオブジェクトファイルを走査し,作成する .defファイルにそれらのエントリーを書き出します.

DLLからエクスポートされるように関数に印を付けるため,オブジェクトファ イルの‘.drectve’セクションに,-export:<name_of_function> エントリーが必要です.これは,Cでasm()演算子を使用することで可能となり ます.

       asm (".section .drectve");
       asm (".ascii \"-export:my_func\"");
     
       int my_func (void) { ... }

DLLの作成に必要とされる二番目のファイルは,エクスポートファイルです. このファイルは,DLL本体を作成し,DLLと外部世界の間のインターフェースを 取り扱うオブジェクトファイルとリンクされます.これはバイナリファイルで, dlltool.defファイルの作成または読み込みをしていると きに,それに-eオプションを与えると作成されます.

DLLの作成に必要とされる三番目のファイルは,DLL内の関数にアクセスするた めにプログラムとリンクするライブラリファイルです.このファイルは, dlltool.defファイルの作成または読み込みをしていると きに,それに-lオプションを与えると作成されます.

dlltoolは,手動でライブラリファイルを構築しますが,それは, アセンブラ宣言を含む一時ファイルを作成し,それをアセンブルすることで, エクスポートファイルを構築します.-Sコマンドラインオプション は,dlltoolが使用するアセンブラへのパスを指定するため使用す ることが可能で,-fオプションは,そのアセンブラに特別なフラグ を渡すために使用することが可能です.-nは,dlltoolが これらの一時的なアセンブラファイルを終了後に削除することを防ぐために使 用することが可能で,-nが二回指定されている場合は, dlltoolがライブラリを構築するために使用した,一時的なオブジェ クトファイルが削除されることを防ぎます.

ソースファイル‘dll.c’からDLLを作成し,そのDLLを使用しているプログ ラムも(‘program.o’という名前のオブジェクトファイルから)作成してい る例は以下のようになります.

       gcc -c dll.c
       dlltool -e exports.o -l dll.lib dll.o
       gcc dll.o exports.o -o dll.dll
       gcc program.o dll.lib -o program

コマンドラインオプションには以下の意味があります.

-d filename
--input-def filename
読み込み,処理する.defファイルの名前を指定します.
-b filename
--base-file filename
読み込み,処理するベースファイルの名前を指定します.このファイルの内容 に,dlltoolで生成されるエクスポートファイルの,再配置のセク ションが追加されます.
-e filename
--output-exp filename
dlltoolで作成される,.defファイルの名前を指定します.
-z filename
--output-def filename
dlltoolで作成される,.defファイルの名前を指定します.
-l filename
--output-lib filename
dlltoolで作成される,ライブラリファイルの名前を指定します.
--export-all-symbols
入力ファイル内のエクスポートされるシンボルとして見つかったものは,すべ て大域的にweakとして定義されているシンボルとして扱います.これらは,デ フォルトでエクスポートされないシンボルの小さなリストです. --no-default-excludesオプションを参照してください. --exclude-symbolsオプションを使用して,エクスポートされないシ ンボルのリストを追加してもかまいません.
--no-export-all-symbols
入力の.defファイルや入力オブジェクトファイルの‘.drectve’セ クションで,明示的にリストアップされているシンボルのみエクスポートしま す.‘.drectve’は,ソースコード内の‘dllexport’属性で作成され ます.
--exclude-symbols list
list内のシンボルをエクスポートしません.これは,カンマまたはコロ ン文字で分けられた,シンボル名のリストです.シンボル名に,アンダースコ アの前置を含めることはできません.これは, --export-all-symbolsが使用されているときのみ意味があります.
--no-default-excludes
--export-all-symbolsが使用されているとき,それはデフォルトで, ある特別なシンボルをエクスポートすることを避けます.現在のエクスポート を避けるリストは,‘DllMain@12’, ‘DllEntryPoint@0’, ‘impure_ptr’です.これらの特別なシンボルを進んでエクスポートする ために,--no-default-excludesオプションを使用してもかまいませ ん.これは,--export-all-symbolsが使用されているときのみ意味 があります.
-S path
--as path
エクスポートファイルを作成するために使用するアセンブラの,ファイル名を 含む,パスを指定します.
-f options
--as-flags options
エクスポートファイルを構築しているときアセンブラに渡す,あらゆる特別な コマンドラインオプションを指定します.このオプションは,-Sが 指定されていないかのように動作します.このオプションは一つの引数のみ渡 し,コマンドラインに一回以上出現する場合,最後に出現したものを,前に出 現したものに優先させます.そのため,複数のオプションをアセンブラに渡す 必要がある場合は,二重引用符で囲む必要があります.
-D name
--dll-name name
-eオプションが使用されてるとき,DLLの名前として.defファ イルに保存する名前を指定します.このオプションがない場合,-e オプションで与えられるファイル名は,DLLの名前として使用されます.
-m machine
-machine machine
ライブラリファイルが構築されるマシンの形式を指定します. dlltoolには,構築のされ方に依存するデフォルト形式があります が,このオプションで,それに優先させることが可能です.これは通常,ARM プロセッサに対するDLLを作成するときのみ役に立ち,DLLの内容は,実際に Thumb命令を使用して符号化されます.
-a
--add-indirect
dlltoolがエクスポートファイルを作成しているとき,エクスポー ト関数がインポートライブラリを使用しないで参照できるように,セクション を加えることを指定します.たとえ,それが地獄を意味しようとも!
-U
--add-underscore
dlltoolエクスポートファイルを作成しているとき,エクスポート 関数の名前にアンダースコアを前置することを指定します.
-k
--kill-at
dlltoolエクスポートファイルを作成しているとき,文字列 ‘@ <number>’を追加しないことを指定します.これらの数字は,序数と 呼ばれ,DLL では関数にアクセスする一つの方法を表示し,それ以外では名前 で表示します.
-A
--add-stdcall-alias
dlltoolがエクスポートファイルを作成しているとき,シンボルに ‘@ <number>’を追加したものを,‘@ <number>’なしでstdcallシ ンボルの別名を加えることを指定します.
-x
--no-idata4
dlltoolエクスポートファイルとライブラリファイルを作成してい るとき,.idata4セクションを削除することを指定します.これは,あ るオペレーティングシステムとの互換性のためです.
-c
--no-idata5
dlltoolエクスポートファイルとライブラリファイルを作成してい るとき,.idata5セクションを削除することを指定します.これは,あ るオペレーティングシステムとの互換性のためです.
-i
--interwork
dlltoolが,生成しているライブラリファイルとエクスポートファ イル内のオブジェクトに,ARMとThumb間での相互動作をサポートするように印 を付けることを指定します.
-n
--nodelete
dlltoolが,エクスポートファイルを作成するために使用した一時 的なアセンブラファイルを保存するようにします.このオプションが繰り返さ れる場合,dlltoolは,ライブラリを作成するために使用する一時 的なオブジェクトファイルも保存します.
-v
--verbose
dlltoolが,行っていることを記述します.
-h
--help
コマンドラインオプションのリストを表示し終了します.
-V
--version
dlltoolのバージョンナンバーを表示し終了します.