[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

13. dlltool

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=binutils-ja&node=dlltool"
"binutils/dlltool"へのコメント(無し)

WindowsのようなPEフォーマットイメージファイルを理解するシステムで,ダイ ナミックリンクライブラリ(DLL)を作成するために必要なファイルを作成するた めに,dlltoolは使用されます.DLLには,参照元のプログラムが参 照先を実行時に解決するためにローダが必要とする情報を含んでいる,エクス ポートテーブルが含まれます.

エクスポートテーブルは,`.def'ファイルやを読み込んだり,DLL内の `.a'と`.o'ファイルをスキャンすることで,このプログラムが生成 します.`.o'ファイルには,エクスポート情報がある特殊な `.drectve'セクションを含めることが可能です.

Note: 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']
        [`-p'|`--ext-prefix-alias' prefix]
        [`-x'|`--no-idata4'] [`-c'|`--no-idata5'] [`-i'|`--interwork']
        [`-n'|`--nodelete'] [`-t'|`--temp-prefix' prefix]
        [`-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:' エ ントリーが必要です.これは,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で作成される,エクスポートファイルの名前を指定します.

-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エクスポートファイルを作成しているとき,文字列 `@ 'を追加しないことを指定します.これらの数字は,序数と 呼ばれ,DLL では関数にアクセスする一つの方法を表示し,それ以外では名前 で表示します.

-A
--add-stdcall-alias
dlltoolがエクスポートファイルを作成しているとき,シンボルに `@ 'を追加したものを,`@ 'なしでstdcallシン ボルの別名を加えることを指定します.

-p
--ext-prefix-alias prefix
dlltoolで,すべてのDLLインポートに対して指定した接頭辞で外部 へのエイリアスを作成します.エイリアスは外部とインポートの両方のシンボ ルを前置するアンダースコア無しで作成します.

-x
--no-idata4
dlltoolエクスポートファイルとライブラリファイルを作成している とき,.idata4セクションを削除することを指定します.これは,ある オペレーティングシステムとの互換性のためです.

-c
--no-idata5
dlltoolエクスポートファイルとライブラリファイルを作成している とき,.idata5セクションを削除することを指定します.これは,ある オペレーティングシステムとの互換性のためです.

-i
--interwork
dlltoolが,生成しているライブラリファイルとエクスポートファイ ル内のオブジェクトに,ARMとThumb間での相互動作をサポートするように印を 付けることを指定します.

-n
--nodelete
dlltoolが,エクスポートファイルを作成するために使用した一時的 なアセンブラファイルを保存するようにします.このオプションが繰り返され る場合,dlltoolは,ライブラリを作成するために使用する一時的な オブジェクトファイルも保存します.

-t prefix
--temp-prefix prefix
dlltoolが,一時的なアセンブラとオブジェクトファイルの名前を構 成するとき,prefixを使用するようにします.デフォルトで,一時的な ファイルの接頭辞はpidから生成されます.

-v
--verbose
dlltoolが,行っていることを記述します.

-h
--help
コマンドラインオプションのリストを表示し終了します.

-V
--version
dlltoolのバージョンナンバーを表示し終了します.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

13.1 dlltool `.def'ファイルのフォーマット

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=binutils-ja&node=def%20file%20format"
"binutils/dlltool`.def'ファイルのフォーマット"へのコメント(無し)

`.def'ファイルには,任意の数の以下のコマンドが含まれています.

NAME name [ , base ]
結果として,name.exeという名前になります.

LIBRARY name [ , base ]
結果として,name.dllという名前になります.

EXPORTS ( ( ( name1 [ = name2 ] ) | ( name1 = module-name . external-name ) )
[ integer ] [ NONAME ] [ CONSTANT ] [ DATA ] [ PRIVATE ] ) *
name1をDLLのエクスポートシンボルとして序数integerを追加して 宣言し,また,DLL module-nameの関数external-nameの(前出の) 別名としてname1を宣言します.

IMPORTS ( ( internal-name = module-name . integer ) | [ internal-name = ] module-name . external-name ) ) *
序数がintegerexternal-nameやエクスポートした関数が,ファ イルmodule-nameからインポートされるものとして宣言します. internal-nameが指定されている場合,これは,DLLの本体にある,イン ポートされる関数が参照する名前になります.

DESCRIPTION string
stringを出力される`.exp'ファイルの.rdataセクションに 書き込みます.

STACKSIZE number-reserve [, number-commit ]
HEAPSIZE number-reserve [, number-commit ]
--stack--heapnumber-reservenumber-commitを,出力の.drectveセクションに生成します.リ ンカはこれを見て,それに作用します.

CODE attr +
DATA attr +
SECTIONS ( section-name attr + ) *
--attr section-name attrを出力の.drectveセク ションに生成し,そこでのattrREADWRITEEXECUTE,またはSHAREDのいずれかになります.リンカはこれを 見て,それに作用します.


[ << ] [ >> ]           [表紙] [目次] [索引] [検索] [上端 / 下端] [?]