Linux / Unixコマンド:Id

ld - LDを使用すると、 GNUリンカ

シノプシス

ld [ options ] objfile ...

DESCRIPTION

ldはいくつかのオブジェクトファイルとアーカイブファイルを結合し、それらのデータを再配置し、シンボル参照を関連付けます。 通常、プログラムをコンパイルする最後のステップはldを実行することです。

ldはAT&Tのリンクエディタコマンド言語の構文のスーパーセットで書かれたリンカコマンド言語ファイルを受け入れて、リンクプロセスを明白かつ完全に制御します。

このマニュアルページにはコマンド言語は記載されていません。 コマンド言語やGNUリンカの他の側面についての詳細は、 "info"のldエントリ、またはマニュアルld: GNUリンカを参照してください。

このバージョンのldは汎用のBFDライブラリを使ってオブジェクトファイルを操作します。 これにより、 ldはCOFFや "a.out"のように多くの異なるフォーマットでオブジェクトファイルを読み込み、結合し、書き込むことができます。 利用可能な種類のオブジェクトファイルを生成するために、異なるフォーマットを互いにリンクすることができる。

その柔軟性とは別に、GNUリンカーは診断情報を提供する際に他のリンカーよりも役立ちます。 多くのリンカは、エラーが発生したときにすぐに実行を中止します。 可能であれば、 ldは実行を続け、他のエラーを特定することができます(または、エラーにもかかわらず出力ファイルを取得する場合もあります)。

GNU リンカldは、幅広い状況をカバーし、他のリンカとできるだけ互換性があるように意図されています。 結果として、その動作を制御する多くの選択肢があります。

オプション

リンカは多くの コマンドラインオプション をサポートしてい ます が、実際には特定の状況で使用されるものはほとんどありません。 例えば、 ldの頻繁な使用は、標準のサポートされているUnixシステム上で、標準のUnixオブジェクトファイルをリンクすることです。 このようなシステムでは、ファイル "hello.o"をリンクするには:

ld -o <出力> /lib/crt0.o hello.o -lc

これは、ファイル "/lib/crt0.o"と "hello.o"とライブラリ "libc.a"を標準の検索ディレクトリからリンクする結果として、 outputというファイルを生成するようにldに指示します。 (以下の-lオプションの説明を参照してください。)

ldの コマンドラインオプションのいくつかは、 コマンドラインの任意のポイントで指定することができます。 しかし、 -l-Tのようなファイルを参照するオプションは、オブジェクトファイルやその他のファイルオプションに相対して、オプションがコマンドラインに現れる場所でファイルを読み込みます。 別の引数を指定してファイル以外のオプションを繰り返すことは、それ以上の効果を持たないか、そのオプションの前のオカレンス(コマンドラインの左側にあるもの)を上書きします。 以下の説明では、2回以上意味のあるオプションを指定している場合があります。

非オプション引数は、リンクされるオブジェクトファイルまたはアーカイブです。 それらはオプションと引数の間にオブジェクトファイルの引数を置くことができないという点を除いて、コマンドラインオプションに従うか、先行するか、または混在させることができます。

通常、リンカーは少なくとも1つのオブジェクトファイルで呼び出されますが、 -l-R 、およびスクリプトコマンド言語を使用して、他の形式のバイナリ入力ファイルを指定することもできます。 バイナリ入力ファイルがまったく指定されていない場合、リンカは出力を生成せず、 No input filesというメッセージを発行します

リンカがオブジェクトファイルの形式を認識できない場合、リンカスクリプトであるとみなされます。 この方法で指定されたスクリプトは、リンクに使用されるメインリンカースクリプト(デフォルトリンカースクリプトまたは-Tを使用して指定されたスクリプト)を補強します。 この機能により、リンカはオブジェクトやアーカイブのように見えるファイルとリンクすることができますが、実際にはシンボル値を定義するだけで、 "INPUT"や "GROUP"を使用して他のオブジェクトをロードします。 この方法でスクリプトを指定すると、主リンカースクリプトが増やされるだけであることに注意してください。 デフォルトのリンカースクリプトを完全に置き換えるには、 -Tオプションを使用します。

名前が単一の文字であるオプションの場合、オプション引数は、空白を介さずにオプション文字の後に付けるか、またはそれらを必要とするオプションの直後に別々の引数として指定する必要があります。

名前が複数の文字であるオプションの場合、オプション名の前に1つまたは2つの名前を付けることができます。 たとえば、 -trace-symbolおよび--trace-symbolは同等です。 注 - このルールには1つの例外があります。 小文字の「o」で始まる複数の文字オプションの前には、2つのダッシュを付けることができます。 これは、 -oオプションの混乱を減らすためです。 たとえば、 -omagicは出力ファイル名をmagicに設定し、--omagicは出力にNMAGICフラグを設定します。

複数文字オプションへの引数は、オプション名と等号で区切られていなければなりません。また、オプション名の直後に別の引数として指定する必要があります。 たとえば、-- trace-symbol foo--trace-symbol = fooは同等です。 複数の文字のオプションの名前の一意の略語が受け入れられます。

注 - リンカがコンパイラドライバ( gccなど )を介して間接的に呼び出されている場合、すべてのリンカコマンドラインオプションの前に-Wl (または特定のコンパイラドライバに適切なもの)を付ける必要があります。

gcc -Wl、 - startgroup foo.o bar.o -Wl、 - endgroup

これは重要です。そうしないと、コンパイラドライバプログラムがリンカオプションを静かにドロップし、リンクが不正になる可能性があるからです。

GNUリンカによって受け入れられる一般的なコマンドラインスイッチの表は次のとおりです。

-a キーワード

このオプションは、HP / UXとの互換性のためにサポートされています。 キーワード引数は、 archiveshared 、またはdefaultのいずれかの文字列でなければなりません。 -aarchiveは機能的に-Bstaticと等価であり、他の2つのキーワードは機能的に-Bdynamicと同等です。 このオプションは任意の回数使用できます。

- アーキテクチャ

--architecture = architecture

ldの現在のリリースでは、このオプションはIntel 960ファミリのアーキテクチャでのみ有効です。 そのldの設定では、 architecture引数は960ファミリの特定のアーキテクチャを特定し、いくつかの保護を可能にし、アーカイブライブラリの検索パスを変更します。

ldの将来のリリースでは、他のアーキテクチャファミリにも同様の機能がサポートされる可能性があります。

-b 入力形式

--format = 入力形式

ldは、複数の種類のオブジェクトファイルをサポートするように構成することができます。 ldがこのように設定されている場合、 -bオプションを使用して、コマンド行でこのオプションの後に続く入力オブジェクトファイルのバイナリ形式を指定することができます。 ldが別のオブジェクト形式をサポートするように設定されている場合でも、通常はこれを指定する必要はありません。ldは各マシンで最も一般的な形式をデフォルト入力形式として使用するように構成する必要があります。 input-formatはテキスト文字列で、BFDライブラリでサポートされている特定の形式の名前です。 ( objdump -iを使用して利用可能なバイナリ形式を一覧表示できます)。

このオプションは、ファイルを通常と異なるバイナリ形式でリンクする場合に使用します。 特定の形式のオブジェクトファイルの各グループの前に-b input-formatを含めることによって、 -bを使用して明示的にフォーマットを切り替えることもできます(異なるフォーマットのオブジェクトファイルをリンクする場合)。

デフォルトの形式は、環境変数 "GNUTARGET"から取得されます。

コマンド "TARGET"を使用して、スクリプトから入力フォーマットを定義することもできます。

-c MRIコマンドファイル

--mri-script = MRI コマンドファイル

MRIによって生成されたリンカとの互換性のために、 ldは、代替の制限付きコマンド言語で書かれたスクリプトファイルを受け取ります。これについては、GNU ld documentationのMRI Compatible Script Filesセクションを参照してください。 オプション-cを指定してMRIスクリプトファイルを導入する。 -Tオプションを使用して、汎用のldスクリプト言語で記述されたリンカースクリプトを実行します。 MRI-cmdfileが存在しない場合、 ld-Lオプションで指定されたディレクトリでそれを探します。

-d

-dc

-dp

これら3つのオプションは同等です。 他のリンカーとの互換性のために複数のフォームがサポートされています。 再配置可能な出力ファイルが指定されていても、共通シンボルにスペースを割り当てます( -rを指定)。 スクリプトコマンド "FORCE_COMMON_ALLOCATION"は同じ効果を持ちます。

-e entry

--entry = エントリ

デフォルトのエントリポイントではなく、プログラムの実行を開始するための明示的なシンボルとしてentryを使用します。 entryという名前のシンボルがない場合、リンカはエントリを数字として解析し、エントリアドレスとして使用しようとします(数字は底10で解釈されます; 下位 16には0x 、ベース8)。

-E

--export-dynamic

動的にリンクされた実行可能ファイルを作成するときは、すべてのシンボルを動的シンボルテーブルに追加します。 動的シンボルテーブルは、実行時に動的オブジェクトから見えるシンボルのセットです。

このオプションを使用しないと、ダイナミックシンボルテーブルには通常、リンクに記述されているいくつかのダイナミックオブジェクトによって参照されるシンボルのみが含まれます。

"dlopen"を使用して動的オブジェクトをロードする場合、他の動的オブジェクトではなくプログラムによって定義されたシンボルを参照する必要がある場合は、プログラム自体をリンクするときにこのオプションを使用する必要があります。

バージョンスクリプトを使用して、出力フォーマットがサポートしている場合は、動的シンボルテーブルに追加するシンボルを制御することもできます。 @ref {VERSION}の--version-scriptの説明を参照してください。

-EB

ビッグエンディアンオブジェクトをリンクします。 これは、デフォルトの出力形式に影響します。

-EL

リトルエンディアンオブジェクトをリンクします。 これは、デフォルトの出力形式に影響します。

-f

- 補助的な 名前

ELF共有オブジェクトを作成するときは、内部DT_AUXILIARYフィールドを指定された名前に設定します。 これは、共有オブジェクトのシンボルテーブルが共有オブジェクト名のシンボルテーブル上の補助フィルタとして使用されるべきであることをダイナミックリンカに伝えます。

後でプログラムをこのフィルタオブジェクトにリンクすると、プログラムを実行すると、ダイナミックリンカにDT_AUXILIARYフィールドが表示されます。 動的リンカーがフィルターオブジェクトのシンボルを解決すると、まず共有オブジェクト名に定義があるかどうかをチェックします。 存在する場合、フィルタオブジェクト内の定義の代わりに使用されます。 共有オブジェクトは存在する必要はありません。 したがって、共有オブジェクトを使用して、デバッグまたはマシン固有のパフォーマンスのために、特定の機能の代替実装を提供することができます。

このオプションは複数回指定できます。 DT_AUXILIARYエントリは、コマンドラインで表示される順序で作成されます。

-Fの 名前

- フィルタ

ELF共有オブジェクトを作成するときは、内部DT_FILTERフィールドを指定された名前に設定します。 これは、作成中の共有オブジェクトのシンボルテーブルを、共有オブジェクト名のシンボルテーブル上のフィルタとして使用する必要があることをダイナミックリンカに通知します。

後でプログラムをこのフィルタオブジェクトにリンクすると、プログラムを実行すると、ダイナミックリンカにDT_FILTERフィールドが表示されます。 ダイナミックリンカは、通常どおりフィルタオブジェクトのシンボルテーブルに従ってシンボルを解決しますが、実際には共有オブジェクトにある定義にリンクします。 したがって、フィルタオブジェクトを使用して、オブジェクトによって提供されるシンボルのサブセットを選択することができる。

古いリンカの中には、入力と出力の両方のオブジェクトファイルのオブジェクトファイル形式を指定するコンパイルツールチェーン全体で-Fオプションを使用していたものがあります。 GNUリンカはこの目的のために、 -b 、-- format 、-- oformatオプション、リンカスクリプトの "TARGET"コマンド、および "GNUTARGET"環境変数を使用します。 ELF共有オブジェクトを作成しない場合、GNUリンカは-Fオプションを無視します。

-finiの 名前

ELF実行可能ファイルまたは共有オブジェクトを作成するときは、関数のアドレスにDT_FINIを設定して、実行可能ファイルまたは共有オブジェクトがアンロードされたときにNAMEを呼び出します。 デフォルトでは、リンカは "_fini"を呼び出し関数として使用します。

-g

無視されます。 他のツールとの互換性のために提供されています。

-G

--gpsize = value

GPレジスタを使用してサイズを最適化するオブジェクトの最大サイズを設定します 。 これは、大小のオブジェクトを異なるセクションに入れることをサポートするMIPS ECOFFなどのオブジェクトファイル形式でのみ意味があります。 他のオブジェクトファイル形式では無視されます。

名前

-soname = name

ELF共有オブジェクトを作成するときは、内部DT_SONAMEフィールドを指定された名前に設定します。 実行可能ファイルがDT_SONAMEフィールドを持つ共有オブジェクトにリンクされている場合、実行可能ファイルが実行されると、ダイナミックリンカは、リンカに与えられたファイル名を使用するのではなく、DT_SONAMEフィールドで指定された共有オブジェクトをロードしようとします。

-私

増分リンクを実行します(オプション-rと同じ)。

〜の 名前

ELF実行可能ファイルまたは共有オブジェクトを作成するときは、DT_INITに関数のアドレスを設定して、実行可能ファイルまたは共有オブジェクトがロードされたときにNAMEを呼び出します。 デフォルトでは、リンカは "_init"を呼び出し関数として使用します。

-l アーカイブ

--library = archive

リンクするファイルのリストにアーカイブファイル アーカイブを追加します 。 このオプションは任意の回数使用できます。 ldは指定されたアーカイブごとに "libarchive.a"の出現をパスリストで検索します。

共有ライブラリをサポートするシステムでは、 ldは ".a"以外の拡張子を持つライブラリも検索することがあります。 具体的には、ELFとSunOSシステムでは、拡張子が ".a"のライブラリを検索する前に、拡張子が ".so"のライブラリをディレクトリで検索します。 規約上、 ".so"拡張子は共有ライブラリを示します。

リンカーは、コマンドラインで指定された場所でアーカイブを1回だけ検索します。 アーカイブが、コマンドラインでアーカイブの前に現れたオブジェクトの中で未定義のシンボルを定義している場合、リンカはアーカイブから適切なファイルをインクルードします。 ただし、コマンド行の後に表示されるオブジェクトの未定義のシンボルによって、リンカーはアーカイブを再度検索することはありません。

リンカーにアーカイブを複数回検索させる方法については、 - (オプション)を参照してください。

同じアーカイブをコマンドラインで複数回リストすることができます。

このタイプのアーカイブ検索は、Unixリンカの標準です。 ただし、 ld onAIXを使用している場合は、AIXリンカーの動作とは異なることに注意してください。

-L searchdir

--library-path = searchdir

ldがアーカイブライブラリとld制御スクリプトを検索するパスのリストにsearchdirパスを追加します。 このオプションは任意の回数使用できます。 ディレクトリーは、コマンド行で指定された順序で検索されます。 コマンドラインで指定されたディレクトリは、デフォルトディレクトリの前に検索されます。 すべての-Lオプションは、オプションが表示される順序に関係なく、すべての-lオプションに適用されます。

searchdirが "="で始まる場合、 "="はsysroot接頭辞で置き換えられます。これは、リンカーの設定時に指定されたパスです。

検索されるパスのデフォルトセット( -Lで指定されない)は、どのエミュレーションモードが使用されているかによって異なります。

これらのパスは、リンクスクリプト内で "SEARCH_DIR"コマンドで指定することもできます。 この方法で指定されたディレクトリは、リンカスクリプトがコマンドラインに現れる場所で検索されます。

-m エミュレーション

エミュレーションリンカーをエミュレートします。 使用可能なエミュレーションは、 - verboseまたは-Vオプションを使用して表示できます。

-mオプションが使用されていない場合、エミュレーションは定義されている場合は、 "LDEMULATION"環境変数から取得されます。

それ以外の場合、デフォルトのエミュレーションはリンカーの設定方法によって異なります。

-M

--print-map

リンクマップを標準出力に出力します。 リンクマップは、次のようなリンクに関する情報を提供します。

*

オブジェクトファイルとシンボルがメモリにマップされる場所。

*

共通シンボルの割り当て方法。

*

リンクに含まれるすべてのアーカイブメンバー。アーカイブメンバーの持ち込みにつながったシンボルの言及。

-n

--nmagic

可能であれば、セクションのページアラインメントをオフにし、出力を「NMAGIC」とマークします。

-N

オマージュ

テキストセクションとデータセクションを読み書き可能に設定します。 また、データ・セグメントをページ・アラインしたり、共有ライブラリーとのリンクを使用不可にしたりしないでください。 出力フォーマットがUnixスタイルのマジックナンバーをサポートしている場合は、出力を「OMAGIC」とマークします。

- no-omagic

このオプションは、 -Nオプションの効果のほとんどを無効にします。 これは、テキストセクションを読み取り専用に設定し、データセグメントを強制的にページに揃えるようにします。 注 - このオプションは共有ライブラリとのリンクを有効にしません。 これには-Bdynamicを使用します。

-o 出力

--output = 出力

ldによって生成されたプログラムの名前としてoutputを使用します 。 このオプションを指定しないと、デフォルトでa.outという名前が使用されます。 スクリプトコマンド "OUTPUT"は、出力ファイル名を指定することもできます。

-O レベル

levelが0より大きい数値の場合ldは出力を最適化します。 これにはかなりの時間がかかるため、最終的なバイナリに対してのみ有効にしてください。

-q

--emit-relocs

再配置セクションとコンテンツを完全にリンクされたexececutablesにしておきます。 実行可能ファイルの正しい変更を実行するために、リンク解析および最適化ツールにこの情報が必要な場合があります。 その結果、実行可能ファイルが大きくなります。

このオプションは現在、ELFプラットフォームでのみサポートされています。

-r

- relocateable

再配置可能な出力を生成する---すなわち、 ldへの入力として機能する出力ファイルを生成する。 これは、 部分リンクと呼ばれることがよくあります。 副作用として、標準のUnixマジックナンバーをサポートする環境では、このオプションは出力ファイルのマジックナンバーを "OMAGIC"に設定します。 このオプションを指定しないと、絶対ファイルが生成されます。 C ++プログラムをリンクするとき、このオプションコンストラクタへの参照を解決しません 。 それをするには、

入力ファイルが出力ファイルと同じ形式でない場合、部分的なリンクは、その入力ファイルに再配置が含まれていない場合にのみサポートされます。 異なる出力形式にはさらに制限があります。 例えば、いくつかの "a.out"ベースのフォーマットは、他のフォーマットの入力ファイルとの部分的なリンクをまったくサポートしていません。

このオプションは、 -iと同じことを行います

-R filename

--just-symbols = filename

ファイル名からシンボル名とそのアドレスを読み込みますが、 ファイル名を再配置したり、出力に含めたりしないでください。 これにより、出力ファイルは、他のプログラムで定義されているメモリの絶対的な位置を記号的に参照することができます。 このオプションを複数回使用することができます。

他のELFリンカーとの互換性のために、 -Rオプションの後にファイル名ではなくディレクトリ名が続く場合、 -rpathオプションとして扱われます。

-s

--strip-all

出力ファイルからすべてのシンボル情報を省略します。

-S

--strip-debug

デバッガのシンボル情報(ただしすべてのシンボルではありません)を出力ファイルから省略します。

-t

- トレース

ldがそれらを処理するときに、入力ファイルの名前を表示します。

-T スクリプトファイル

--script = scriptfile

リンカースクリプトとしてscriptfileを使用します 。 このスクリプトはldのデフォルトのリンカスクリプトを(それに追加するのではなく)置き換えるので、 commandfileは出力ファイルを記述するのに必要なすべてのものを指定しなければなりません。 現在のディレクトリにscriptfileが存在しない場合、 "ld"はそれ以前の-Lオプションで指定されたディレクトリでそれを探します。 複数の-Tオプションが蓄積されます。

-u シンボル

--undefined = symbol

シンボルを未定義シンボルとして出力ファイルに入力します。 これを行うと、例えば、標準ライブラリから追加のモジュールをリンクすることができます。 追加の未定義シンボルを入力するために、異なるオプション引数を使用して-uを繰り返すことができます。 このオプションは、 "EXTERN"リンカースクリプトコマンドと同等です。

C ++以外のプログラムの場合、このオプションは-rと同じです。すなわち、リロケータブル出力を生成します。つまり、出力ファイルはldへの入力として機能します。 C ++プログラムをリンクするとき、 -Ur -rとは異なり、コンストラクタへの参照を解決します。 -Urとリンクされているファイルに対しては使用できません。 いったんコンストラクタテーブルが構築されると、それを追加することはできません。 最後の部分的リンクに対してのみ、または他の部分リンクに対しては-rを使用します。

--unique [= SECTION ]

SECTIONと一致する入力セクションごとに個別の出力セクションを作成するか、オプションのワイルドカードSECTION引数が欠落している場合は、孤立した入力セクションごとに出力セクションを作成します。 孤立したセクションは、リンカースクリプトで特に言及されていないセクションです。 コマンドラインでこのオプションを複数回使用することもできます。 リンカースクリプトの出力セクションの割り当てを無効にして、同じ名前の入力セクションの通常のマージを防止します。

-v

- バージョン

-V

ldのバージョン番号を表示します。 -Vオプションは、サポートされているエミュレーションも表示します。

-バツ

--discard-all

すべてのローカルシンボルを削除します。

-バツ

--discard-locals

すべての一時的なローカルシンボルを削除します。 ほとんどのターゲットでは、これはLで始まるすべてのローカルシンボルです。

-y 記号

--trace-symbol = シンボル

シンボルが表示されている各リンクファイルの名前を表示します。 このオプションは任意の回数指定できます。 多くのシステムでは、アンダースコアを前に付ける必要があります。

このオプションは、あなたのリンクに未定義のシンボルがあり、その参照がどこから来たのかわからない場合に便利です。

-Y パス

デフォルトのライブラリ検索パスにパスを追加します 。 このオプションは、Solarisとの互換性のために存在します。

-z キーワード

認識されたキーワードは、「initfirst」、「interpose」、「loadfltr」、「nodefaultlib」、「nodelete」、「nodlopen」、「nodump」、「now」、「origin」、「combreloc」、「nocombreloc」および「nocopyreloc」 " Solarisの互換性のために、他のキーワードは無視されます。 "initfirst"は、実行時に他のオブジェクトの前に最初に初期化されるオブジェクトをマークします。 "interpose"は、シンボルテーブルが介在するオブジェクトに、実行可能ファイル以外のすべてのシンボルの前に挿入します。 "loadfltr"は、実行時にfilteesがすぐに処理されるオブジェクトをマークします。デフォルトのライブラリ検索パス。 「nodelete」は実行時にオブジェクトをアンロードしてはならないことを示します。 "nodlopen"は "dlopen"に利用できないオブジェクトをマークします。 "nldu​​mp"マークはオブジェクトを "dldump"でダンプできないことを示します。 "now"は、遅延のないバインディングでオブジェクトをマークします。 "origin"マークは、オブジェクトに$ ORIGINが含まれている可能性があります。 "defs"は未定義のシンボルを許可しません。 "muldefs"は複数の定義を可能にします。 "combreloc"は、複数の再配置セクションを結合し、それらをソートして動的シンボル検索キャッシングを可能にします。

"nocombreloc"は複数のリロケーションセクションを結合しないようにします。 "nocopyreloc"はコピー再配置の生成を無効にします。

- ( アーカイブ - )

--start-group アーカイブ --end- group

アーカイブは、 アーカイブファイルのリストでなければなりません。 明示的なファイル名または-lオプションのいずれかです。

新しい未定義参照が作成されなくなるまで、指定されたアーカイブが繰り返し検索されます。 通常、アーカイブはコマンドラインで指定された順序で一度だけ検索されます。 後でコマンドラインに表示されるアーカイブ内のオブジェクトによって参照される未定義のシンボルを解決するために、そのアーカイブ内のシンボルが必要な場合、リンカはその参照を解決できません。 アーカイブをグループ化することにより、すべての可能な参照が解決されるまで繰り返し検索されます。

このオプションを使用すると、パフォーマンスが大幅に低下します。 2つ以上のアーカイブ間に避けられない循環参照がある場合にのみ使用することをお勧めします。

--accept-unknown-input-arch

--no-accept-unknown-input-arch

アーキテクチャが認識できない入力ファイルを受け入れるようにリンカーに指示します。 ユーザーは、自分が何をしているのかを知っており、これらの未知の入力ファイルに意図的にリンクさせたいという前提があります。 これは、リリース2.14より前のリンカのデフォルト動作でした。 リリース2.14以降のデフォルトの動作は、そのような入力ファイルを拒否することで、古い動作を復元するために--accept-unknown-input-archオプションが追加されました。

-assert キーワード

このオプションは、 SunOSとの互換性のために無視されます。

- 力学

-dy

-call_shared

ダイナミックライブラリとのリンク。 これは、 共有ライブラリがサポートれているプラ​​ットフォームでのみ意味があります。 このオプションは通常、このようなプラットフォームではデフォルトです。 このオプションのさまざまなバリエーションは、さまざまなシステムとの互換性のためです。 コマンドラインでこのオプションを複数回使用することができます。それは、それに続く-lオプションのライブラリ検索に影響します。

-Bgroup

動的セクションの "DT_FLAGS_1"エントリに "DF_1_GROUP"フラグを設定します。 これにより、実行時リンカーはこのオブジェクトのルックアップを処理し、依存関係はグループ内でのみ実行されます。 --no-undefinedが暗黙指定されています。 このオプションは、 共有ライブラリをサポートするELFプラットフォームでのみ意味があります

-Bstatic

-dn

-non_shared

-静的

共有ライブラリとリンクしないでください。 これは、共有ライブラリがサポートされているプラ​​ットフォームでのみ意味があります。 このオプションのさまざまなバリエーションは、さまざまなシステムとの互換性のためです。 コマンドラインでこのオプションを複数回使用することができます。それは、それに続く-lオプションのライブラリ検索に影響します。

-Bsymbolic

共有ライブラリを作成するときは、グローバルシンボルへの参照を共有ライブラリ内の定義にバインドします(存在する場合)。 通常、共有ライブラリにリンクされたプログラムは、共有ライブラリ内の定義を上書きすることができます。 このオプションは、共有ライブラリをサポートするELFプラットフォーム上でのみ意味があります。

--check-sections

--no-check-sections

セクションアドレスが重複していないかどうかを確認するために割り当てられた後、セクションアドレスをチェックしないようリンカーに尋ねます。 通常、リンカーはこのチェックを実行し、重複が見つかった場合は適切なエラーメッセージを生成します。 リンカーは、オーバーレイのセクションについて知っていて、セクションに余裕を持たせています。 デフォルトの動作は、コマンドラインスイッチ--check-sectionsを使用して復元できます

--cref

相互参照テーブルを出力します。 リンカーマップファイルが生成されている場合は、相互参照テーブルがマップファイルに出力されます。 それ以外の場合は、標準出力に出力されます。

テーブルのフォーマットは意図的に単純なので、必要に応じてスクリプトで簡単に処理できます。 シンボルは名前でソートされて印刷されます。 各シンボルについて、ファイル名のリストが与えられます。 シンボルが定義されている場合は、最初にリストされたファイルが定義の場所になります。 残りのファイルにはシンボルへの参照が含まれています。

--no-define-common

このオプションは、共通シンボルへのアドレスの割り当てを禁止します。 スクリプトコマンド "INHIBIT_COMMON_ALLOCATION"は同じ効果を持ちます。

--no-define-commonオプションを使用すると、出力ファイルタイプの選択から共通シンボルにアドレスを割り当てるという決定を切り離すことができます。 それ以外の場合は、リロケータブルでない出力タイプは、アドレスをCommonシンボルに強制的に割り当てます。 --no-define-commonを使用すると 、共有ライブラリから参照される共通シンボルにメインプログラムのアドレスのみを割り当てることができます。 これにより、共有ライブラリ内の未使用の重複領域がなくなり、実行時シンボル解決のための特殊な検索パスを持つ動的モジュールが多数ある場合に、間違った重複を解決する上での混乱を防ぐことができます。

--defsym symbol = expression

expressionによって指定された絶対アドレスを含むグローバルシンボルを出力ファイルに作成します。 このオプションは、コマンドラインで複数のシンボルを定義するのに必要な回数だけ使用できます。 このコンテキストでは、16進定数または既存のシンボルの名前を指定するか、「+」および「 - 」を使用して16進定数または記号を加算または減算することができます。 もっと精巧な式が必要な場合は、スクリプトからリンカーコマンド言語を使用することを検討してください。 注: シンボル 、等号( `` = '')、および式の間に空白を入れないでください。

--demangle [= スタイル ]

--no-demangle

これらのオプションは、エラーメッセージや他の出力のシンボル名をデマングルするかどうかを制御します。 リンカはdemangleするように指示されると、シンボル名を読み込み可能な形式で表示しようとします。先頭のアンダースコアは、オブジェクトファイル形式で使用されている場合は取り除かれ、C ++のマングルされたシンボル名はユーザが読むことができる名前に変換されます。 コンパイラごとに異なるマングリングスタイルがあります。 オプションのデアンギュリングスタイル引数を使用して、コンパイラに適したデアントラリングスタイルを選択できます。 リンカーは、環境変数COLLECT_NO_DEMANGLEが設定されていない限り、デフォルトでデマングルします。 これらのオプションを使用して、デフォルトを上書きすることができます。

--dynamic-linker ファイル

動的リンカーの名前を設定します。 これは、動的にリンクされたELF実行可能ファイルを生成する場合にのみ意味があります。 デフォルトのダイナミックリンカは通常正しくあります。 あなたが何をしているのか分からない限り、これを使わないでください。

--embedded-relocs

このオプションは、-membedded-picオプションで生成されたMIPS組み込みPICコードをGNUコンパイラおよびアセンブラにリンクする場合にのみ意味があります。 リンカーは、実行時に静的に初期化されたデータをポインタ値に再配置するために使用されるテーブルを作成します。 詳細については、testsuite / ld-empicのコードを参照してください。

- 致命的警告

すべての警告をエラーとして扱います。

--force-exe-suffix

出力ファイルに.exe接尾辞が付いていることを確認します。

正常にビルドされた完全にリンクされた出力ファイルに "。exe"または " .dll "という接尾辞がない場合、このオプションはリンカーに出力ファイルを ".exe"接尾辞付きの同じ名前にコピーさせます。 このオプションは、Microsoft Windowsホストで未修正のUnixメークファイルを使用する場合に便利です.Windowsのバージョンによっては、「.exe」という接尾辞で終わらない限りイメージは実行されないためです。

--no-gc-sections

--gc-sections

未使用の入力セクションのガベージコレクションを有効にします。 このオプションをサポートしていないターゲットでは無視されます。 このオプションは-rと互換性がなく、ダイナミックリンクでも使用しないでください。 コマンド行で--no-gc-sectionsを指定すると、このガベージコレクションを実行しないデフォルトの動作を復元できます。

- 助けて

コマンドラインオプションの概要を標準出力に出力し、終了します。

--target-help

すべてのターゲット固有のオプションの概要を標準出力に出力して終了します。

マップマップ ファイル

リンクマップをファイルmapfileに出力します 。 上記の-Mオプションの説明を参照してください。

--no-keep-memory

ldは通常、入力ファイルのシンボルテーブルをメモリにキャッシュすることにより、 メモリ使用量に対する速度を最適化します。 このオプションは、必要に応じてシンボルテーブルを再読み込みすることによって、代わりにldにメモリ使用量を最適化するよう指示します。 これは、大きな実行可能ファイルをリンクしているときにldがメモリ領域を使い果たした場合に必要になることがあります。

--no-undefined

-z defs

通常、非シンボリック共有ライブラリを作成するときは、未定義のシンボルが許可され、実行時ローダによって解決されます。 これらのオプションは、そのような未定義シンボルを許可しません。

--allow-multiple-definition

-z muldefs

通常、シンボルが複数回定義されている場合、リンカは致命的なエラーを報告します。 これらのオプションは複数の定義を可能にし、最初の定義が使用されます。

--allow-shlib-undefined

--no-undefinedが設定されていても、共有オブジェクトの未定義シンボルを許可する。 通常のオブジェクトの未定義シンボルは引き続きエラーを引き起こしますが、共有オブジェクトの未定義シンボルは無視されます。 no_undefinedの実装は、実行時リンカーが定義されていないシンボルを詰まらせることを前提としています。 しかし、カーネルがロード時にパッチを当てて現在のアーキテクチャに最も適している関数を選択するので、共有ライブラリ内の未定義のシンボルが正常なシステム(BeOS)が少なくとも1つあります。 IEは、適切なmemset関数を動的に選択する。 明らかに、HPPA共有ライブラリには未定義シンボルがあることも普通です。

--no-undefined-version

通常、シンボルに未定義のバージョンがある場合、リンカはそれを無視します。 このオプションは、未定義バージョンのシンボルを許可しません。代わりに致命的なエラーが発行されます。

--no-warn-mismatch

異なるプロセッサーや異なるエンディアンにコンパイルされているため、何らかの理由で不一致の入力ファイルをリンクしようとすると、通常、 ldはエラーを出します。 このオプションは、 ldに 、このような考えられるエラーを黙って許可するべきであることを伝えます。 このオプションは、リンカーのエラーが不適切であることを保証する特別な処置を行った場合にのみ、注意して使用してください。

--no-whole-archive

後続のアーカイブファイルに対して--whole-archiveオプションの効果を無効にします。

--noinhibit-exec

実行可能な出力ファイルがまだ使用可能な場合は、それを保持してください。 通常、リンク処理中にエラーが発生した場合、リンカは出力ファイルを生成しません。 エラーが発生した場合に出力ファイルを書き込まずに終了します。

-nostdlib

コマンドラインで明示的に指定されたライブラリディレクトリのみを検索します。 リンカー・スクリプトで指定されたライブラリー・ディレクトリー(コマンド行で指定されたリンカー・スクリプトを含む)は無視されます。

--oformat 出力形式

ldは、複数の種類のオブジェクトファイルをサポートするように構成することができます。 ldがこのように設定されている場合は、-- oformatオプションを使用して出力オブジェクトファイルのバイナリ形式を指定できます。 ldが別のオブジェクト形式をサポートするように設定されている場合でも、通常はこれを指定する必要はありません。 なぜならldは各マシン上で最も普通の形式をデフォルトの出力形式として生成するように設定する必要があるからです。 output-formatはテキスト文字列であり、BFDライブラリでサポートされている特定のフォーマットの名前です。 ( objdump -iで利用可能なバイナリ形式をリストすることもできます)。スクリプトコマンド "OUTPUT_FORMAT"も出力形式を指定できますが、このオプションはそれを上書きします。

-qmagic

このオプションは、Linux互換では無視されます。

-Qy

このオプションは、SVR4との互換性のために無視されます。

- リラックス

機械依存の効果を持つオプション。 このオプションは、いくつかのターゲットでのみサポートされています。

いくつかのプラットフォームでは、-- relaxオプションは、リンカがアドレスモードを緩和し、出力オブジェクトファイル内の新しい命令を合成するなど、プログラム内のアドレッシングを解決するときに可能になるグローバル最適化を実行します。

いくつかのプラットフォームでは、これらのリンク時にグローバル最適化により、結果として得られる実行可能ファイルのシンボリックデバッグが不可能になることがあります。 これは、Matsushita MN10200およびMN10300ファミリのプロセッサの場合のように知られています。

これがサポートされていないプラットフォームでは、-- relaxは受け入れられますが無視されます。

--retain-symbols-fileファイル

ファイルfilenameにリストされたシンボルのみを保持し、 のシンボルはすべて破棄します。 filenameは単なるフラットファイルで、1行に1つのシンボル名が付いています。 このオプションは、ランタイムメモリを節約するために、大きなグローバルシンボルテーブルが徐々に蓄積される環境(VxWorksなど)で特に便利です。

--retain-symbols-fileは、未定義シンボル、または再配置に必要なシンボルを破棄しませ

コマンドラインでは、 --retain-symbols-fileを 1回だけ指定することができます。 それは-s-Sを無効にします。

-rpath dir

ランタイムライブラリ検索パスにディレクトリを追加します。 これはELF実行可能ファイルを共有オブジェクトとリンクするときに使用されます。 すべての-rpath引数が連結され、実行時リンカーに渡されます。実行時リンカーは、実行時に共有オブジェクトを見つけるためにそれらを使用します。 -rpathオプションは、リンクに明示的に含まれる共有オブジェクトが必要とする共有オブジェクトの検索にも使用されます。 -rpath-linkオプションの説明を参照してください。 ELF実行可能ファイルをリンクするときに-rpathが使用されない場合、環境変数 "LD_RUN_PATH"の内容が定義されていれば使用されます。

SunOS では、-rpathオプションを使用することもできます。 デフォルトでは、SunOSではリンカは与えられたすべての-Lオプションからランタイム検索パッチを作成します。 -rpathオプションを使用すると、ランタイム検索パスは、 -Lオプションを無視して-rpathオプションを使用して排他的に形成されます。 これは、gccを使用するときに便利です。これは、 -Lオプションを多く追加します。これは、NFSマウントされたファイルシステム上にある可能性があります。

他のELFリンカーとの互換性のために、 -Rオプションの後にファイル名ではなくディレクトリ名が続く場合、 -rpathオプションとして扱われます。

-rpath-link DIR

ELFやSunOSを使用する場合、共有ライブラリの中には別の共有ライブラリが必要な場合があります。 これは、 "ld -shared"リンクが共有ライブラリを入力ファイルの1つとして含む場合に発生します。

リンカーは、非共有、非再配置可能なリンクを実行するときにそのような依存関係に遭遇すると、自動的に必要な共有ライブラリを見つけようとし、リンクに明示的に含まれていない場合はリンクに含めます。 そのような場合、 -rpath-linkオプションは検索する最初のディレクトリセットを指定します。 -rpath-linkオプションは、コロンで区切られた名前のリストを指定するか、複数回出現することによってディレクトリ名のシーケンスを指定することができます。

このオプションは、共有ライブラリにハードコンパイルされた可能性のある検索パスを無効にするので、注意して使用する必要があります。 このような場合、実行時リンカーとは異なる検索パスを誤って使用することは可能です。

リンカは、次の検索パスを使用して必要な共有ライブラリを検索します。

1。

-rpath-linkオプションで指定されたディレクトリ。

2。

-rpathオプションで指定されたディレクトリ。 -rpath-rpath-linkの違いは、 -rpathオプションで指定されたディレクトリが実行可能ファイルに含まれ、実行時に使用されることです。-rpath-linkオプションはリンク時にのみ有効です。 これは、ネイティブリンカー専用です。

3。

ELFシステムで、 -rpathオプションと "rpath-link"オプションを使用しなかった場合は、環境変数 "LD_RUN_PATH"の内容を検索します。 これは、ネイティブリンカー専用です。

4。

SunOSでは、 -rpathオプションを使用しなかった場合は、 -Lオプションを使用して指定されたすべてのディレクトリを検索します。

5。

ネイティブリンカーの場合、環境変数 "LD_LIBRARY_PATH"の内容。

6。

ネイティブのELFリンカの場合、共有ライブラリの "DT_RUNPATH"または "DT_RPATH"のディレクトリで、必要な共有ライブラリが検索されます。 "DT_RUNPATH"エントリが存在する場合、 "DT_RPATH"エントリは無視されます。

7。

デフォルトのディレクトリ、通常は/ lib/ usr / lib

8。

ELFシステムのネイティブリンカーの場合、/ etc/ld.so.confファイルが存在する場合、そのファイルにあるディレクトリのリスト。

必要な共有ライブラリが見つからない場合、リンカーは警告を出し、リンクを続行します。

共有

-Bshareable

共有ライブラリを作成します。 現在、ELF、XCOFF、SunOSプラットフォームでのみサポートされています。 SunOSでは、 -eオプションが使用されておらず、リンクに未定義のシンボルがある場合、リンカは自動的に共有ライブラリを作成します。

--sort-common

このオプションはldに、共通シンボルを適切な出力セクションに配置する際にサイズ別にソートするように指示します。 最初にすべての1バイトシンボル、次にすべての2バイト、次にすべての4バイト、そしてそれ以外のものをすべて取得します。 これは、配置制約のためにシンボル間のギャップを防ぐためです。

--split-by-file [ サイズ ]

--split-by-relocと同様ですが、 サイズに達すると各入力ファイルに対して新しい出力セクションを作成します。 sizeが指定されていない場合は、デフォルトで1のサイズになります。

--split-by-reloc [ count ]

出力ファイルに余分なセクションを作成して、ファイル内の単一の出力セクションにカウントの再配置以上が含まれないようにします。 これは、COFFオブジェクトファイル形式で特定のリアルタイムカーネルにダウンロードするための膨大なリロケータブルファイルを生成する場合に便利です。 COFFは1つのセクションに65535を超える再配置を表すことができないためです。 これは、任意のセクションをサポートしていないオブジェクトファイル形式では機能しません。 リンカは再配布のために個々の入力セクションを分割しないので、1つの入力セクションに複数の再配置が含まれる場合、1つの出力セクションにはその多くの再配置が含まれます。 countのデフォルト値は32768です。

--stats

実行時間やメモリ使用量など、リンカの操作に関する統計を計算して表示します。

- 従来のフォーマット

いくつかのターゲットでは、 ldの出力は、既存のリンカの出力とはいくつかの点で異なります。 このスイッチはldに代わりに従来の形式を使用するよう要求します。

たとえば、SunOSでは、 ldはシンボル文字列テーブルに重複エントリを組み込みます。 これにより、完全なデバッグ情報を持つ出力ファイルのサイズを30%以上削減できます。 残念ながら、SunOSの "dbx"プログラムは、結果のプログラムを読むことができません( "gdb"は問題ありません)。 --traditional-formatスイッチは、 ldに重複エントリを結合しないように指示します。

--section-start sectionname = org

orgによって与えられた絶対アドレスで出力ファイルのセクションを探します。 このオプションは、コマンドラインで複数のセクションを見つけるために必要な回数だけ使用できます。 orgは単一の16進整数でなければなりません。 他のリンカーとの互換性のために、通常16進値に関連付けられた先頭の0xを省略することができます。 注: セクション名 、等号( `` = '')、 orgの間には空白を入れないでください。

-Tbss org

- データ 組織

-Text org

orgを、それぞれ出力ファイルの "bss"、 "data"、 "text"セグメントの開始アドレスとして使用します。 orgは単一の16進整数でなければなりません。 他のリンカーとの互換性のために、通常16進値に関連付けられた先頭の0xを省略することができます。

--dll-verbose

- 詳細

ldのバージョン番号を表示し、サポートされているリンカエミュレーションを一覧表示します。 どの入力ファイルを開くことができるかできないかを表示します。 リンカーが使用しているリンカースクリプトを表示します。

--version-script = version-scriptfile

リンカーにバージョンスクリプトの名前を指定します。 これは、作成されるライブラリのバージョン階層に関する追加情報を指定する共有ライブラリを作成するときに、通常使用されます。 このオプションは、共有ライブラリをサポートするELFプラットフォームでのみ意味があります。

--warn-common

共通シンボルが別の共通シンボルまたはシンボル定義と結合されたときに警告します。 Unixリンカはこのやや厄介な習慣を許しますが、他のオペレーティングシステムのリンカはそうしません。 このオプションを使用すると、グローバルシンボルを組み合わせて潜在的な問題を見つけることができます。 残念なことに、いくつかのCライブラリではこの習慣を使用しているので、ライブラリとプログラムのシンボルに関する警告が表示されることがあります。

グローバルシンボルには3種類あり、ここではCの例を示します。

int i = 1;

定義。出力ファイルの初期化されたデータセクションに入ります。

extern int i;

空白を割り当てない、未定義の参照。 変数の定義または共通のシンボルがどこかに存在する必要があります。

int i;

共通のシンボル。 変数に(1つ以上の)共通シンボルがある場合、出力ファイルの初期化されていないデータ領域に入ります。 リンカーは、同じ変数の複数の共通シンボルを1つのシンボルにマージします。 サイズが異なる場合は、最大のサイズが選択されます。 リンカーは、同じ変数の定義がある場合、共通シンボルを宣言に変換します。

--warn-commonオプションは、5種類の警告を生成することができます。 各警告は一対の線で構成されています。最初のシンボルは検出されたシンボルを示し、2番目のシンボルは同じ名前で検出された前のシンボルを示しています。 2つのシンボルの一方または両方が共通のシンボルになります。

1。

シンボルの定義が既に存在するため、共通のシンボルを参照に変換します。

):警告:定義によって上書きされる ` 'の共通事項
):警告:ここで定義

2。

記号の後の定義に遭遇するため、共通の記号を参照に変換する。 これは、シンボルが異なる順序で遭遇することを除いて、前のケースと同じです。

):警告:共通の
)をオーバーライドする ` 'の定義:警告:commonはここにあります

3。

共通のシンボルを以前の同じサイズの共通シンボルとマージする。

):警告:複数の ` '
):警告:以前の共通点はこちら

4。

共通シンボルを以前のより大きな共通シンボルとマージする。

):警告:より一般的な
)によってオーバーライドされる `

5。

共通のシンボルを以前のより小さい共通シンボルとマージする。 これは、シンボルが異なる順序で遭遇することを除いて、前のケースと同じです。

):警告:より一般的な
)をオーバーライドする `

--warn-constructors

グローバルコンストラクタが使用されている場合に警告します。 これは、いくつかのオブジェクトファイル形式でのみ有効です。 COFFやELFのようなフォーマットの場合、リンカはグローバルコンストラクタの使用を検出できません。

--warn-multiple-gp

出力ファイルに複数のグローバルポインタ値が必要な場合に警告します 。 これは、アルファなどの特定のプロセッサでのみ意味があります。 具体的には、プロセッサによっては、特別なセクションに大きな値の定数を入れるものがあります。 特殊レジスタ(グローバルポインタ)はこのセクションの中央を指しているので、定数はベースレジスタ相対アドレッシングモードで効率的にロードできます。 ベースレジスタ相対モードのオフセットは固定され、比較的小さい(例えば16ビット)ので、これは定数プールの最大サイズを制限する。 したがって、大規模なプログラムでは、可能なすべての定数に対処できるように、複数のグローバルポインタ値を使用する必要があることがよくあります。 このオプションを指定すると、このケースが発生するたびに警告が出されます。

- ワーン - ワン

定義されていないシンボルは、それを参照するモジュールごとに1回ではなく、1回だけ警告を出​​します。

--warn-section-align

アライメントのため出力セクションのアドレスが変更された場合に警告します。 通常、アラインメントは入力セクションによって設定されます。 アドレスは、明示的に指定されていない場合にのみ変更されます。 つまり、SECTIONSコマンドでセクションの開始アドレスが指定されていない場合

--whole-archive

--whole-archiveオプションの後にコマンドラインで記述されたアーカイブごとに、必要なオブジェクトファイルのアーカイブを検索するのではなく、アーカイブ内のすべてのオブジェクトファイルをリンクに含めます。 これは、通常、アーカイブファイルを共有ライブラリに変換し、すべてのオブジェクトを結果としての共有ライブラリに含めるために使用されます。 このオプションは複数回使用できます。

gccからこのオプションを使用する場合、2つの注意点があります。まず、gccはこのオプションについて知らないので、-Wl、-whole-archiveを使用する必要があります 。 第2に、あなたのアーカイブのリストの後ろに-Wl、-no-whole-archiveを使うのを忘れないでください.gccは自分のアーカイブのリストをあなたのリンクに追加します。

- 折り返し 記号

シンボルにはラッパー関数を使用します。 シンボルへの未定義参照は "__ wrap_symbol"に解決されます。 "__real_symbol"への定義されていない参照は、 シンボルに解決されます

これは、システム関数のラッパーを提供するために使用できます。 ラッパー関数は "__wrap_symbol"と呼びます。 システム関数を呼び出す場合は、 "__ real_symbol"を呼び出す必要があります。

ここには簡単な例があります:

void * __wrap_malloc(int c){printf( "mallocは%ldで呼び出されました\ n"、c); __real_malloc(c)を返します。 }

--wrap mallocを使用してこのファイルと他のコードをリンクすると、 "malloc"を呼び出すと、代わりに "__wrap_malloc"という関数が呼び出されます。 "__wrap_malloc"の "__real_malloc"の呼び出しは、実際の "malloc"関数を呼び出します。

--wrapオプションなしのリンクが成功するように、 "__real_malloc"関数も提供したいかもしれません。 これを行う場合、 "__ real_malloc"の定義を "__wrap_malloc"と同じファイルに入れるべきではありません。 そうした場合、アセンブラはリンカが "malloc"にラップする前にコールを解決することがあります。

--enable-new-dtags

--disable-new-dtags

このリンカはELFで新しい動的タグを作成できます。 しかし、古いELFシステムはそれらを理解できないかもしれません。 --enable-new-dtagsを指定すると、必要に応じて動的タグが作成されます。 --disable-new-dtagsを指定すると、新しい動的タグは作成されません。 デフォルトでは、新しい動的タグは作成されません。 これらのオプションは、ELFシステムでのみ使用可能であることに注意してください。

i386 PEリンカは-sharedオプションをサポートしています。これにより、出力は通常の実行可能ファイルではなく動的リンクライブラリ(DLL)になります。 このオプションを使用するときは、出力に「* .dll」という名前を付ける必要があります。 さらに、リンカは、オブジェクトファイルのようにリンカコマンドラインで指定できる標準の "* .def"ファイルを完全にサポートしています(実際には、シンボルをエクスポートするアーカイブの前に、通常のオブジェクトファイルのように)。

すべてのターゲットに共通のオプションに加えて、i386 PEリンカは、i386 PEターゲットに固有の追加のコマンドラインオプションをサポートしています。 値をとるオプションは、値からスペースまたは等号で区切ることができます。

--add-stdcall-alias

与えられた場合、stdcall接尾辞(@ nn )を持つシンボルは、そのまま、また、接尾辞を取り除いた形でエクスポートされます。

--base-file ファイル

dlltool使用して DLLを生成するために必要なすべての再配置のベースアドレスを保存するファイルの名前としてfileを使用します

--dll

通常の実行可能ファイルの代わりにDLLを作成します。 与えられた ".def"ファイルで-sharedを使うか、 "LIBRARY"を指定することもできます。

--enable-stdcall-fixup

--disable-stdcall-fixup

リンクが解決できないシンボルを見つけた場合、シンボル名(cdeclとstdcall)の形式だけが異なる別の定義済みのシンボルを探し、リンクすることでそのシンボルを解決します試合へ たとえば、未定義シンボル "_foo"は関数 "_foo @ 12"にリンクされているか、未定義シンボル "_bar @ 16"が関数 "_bar"にリンクされている可能性があります。 リンカーがこれを行うと、通常はリンクに失敗しているはずなので、警告が表示されますが、サードパーティのDLLから生成されたライブラリをインポートすると、この機能が使用可能になることがあります。 --enable-stdcall-fixupを指定すると 、この機能は完全に有効になり、警告は表示されません。 --disable-stdcall-fixupを指定すると 、この機能は無効になり、このような不一致はエラーとみなされます。

--export-all-symbols

指定されている場合、DLLを作成するために使用されたオブジェクトのグローバルシンボルはすべて、DLLによってエクスポートされます。 エクスポートされていないシンボルが存在しない場合は、これがデフォルトであることに注意してください。 シンボルがDEFファイルを介して明示的にエクスポートされるか、または関数属性を介して暗黙的にエクスポートされる場合、このオプションが指定されていない限り、デフォルトでは何もエクスポートされません。 シンボル "DllMain @ 12"、 "DllEntryPoint @ 0"、 "DllMainCRTStartup @ 12"、および "impure_ptr"は自動的にエクスポートされないことに注意してください。 また、他のDLLからインポートされたシンボルは再エクスポートされませんし、 "_head_"で始まるものや "_iname"で終わるものなど、DLLの内部レイアウトを指定するシンボルも表示されません。 さらに、 "libgcc"、 "libstd ++"、 "libmingw32"、または "crtX.o"からのシンボルはエクスポートされません。 名前が "__rtti_"または "__builtin_"で始まるシンボルは、C ++ DLLを支援するためにエクスポートされません。 最後に、エクスポートされないcygwin-privateシンボルの広範なリストがあります(明らかに、これはcygwinターゲットのDLLを構築するときに当てはまります)。

これらのcygwin除外項目は、 "_cygwin_dll_entry @ 12"、 "_cygwin_crt0_common @ 8"、 "_cygwin_noncygwin_dll_entry @ 12"、 "_fmode"、 "_impure_ptr"、 "cygwin_attach_dll"、 "cygwin_premain0"、 "cygwin_premain1"、 "cygwin_premain2"、 "cygwin_premain3" "、" environ "

--exclude-symbols シンボル シンボル 、...

自動的にエクスポートすべきではないシンボルのリストを指定します。 シンボル名はカンマまたはコロンで区切ることができます。

--exclude-libs lib lib 、...

シンボルを自動的にエクスポートしないアーカイブライブラリのリストを指定します。 ライブラリ名はカンマまたはコロンで区切ることができます。 "--exclude-libs ALL"を指定すると、すべてのアーカイブライブラリのシンボルが自動エクスポートから除外されます。 .defファイルに明示的にリストされたシンボルは、このオプションに関係なく、エクスポートされます。

--file-alignment

ファイルの配置を指定します。 ファイル内のセクションは常にこの番号の倍数であるファイルオフセットで始まります。 デフォルトは512です。

- ヒープ リザーブ

- 予約を控えて コミットする

このプログラムのヒープとして使用する予約メモリ(およびオプションでコミット)の量を指定します。 デフォルトは1Mb予約、4Kコミットです。

--image-baseの

プログラムまたはdllのベースアドレスとしてを使用します 。 これは、プログラムまたはdllがロードされるときに使用される最も低いメモリ位置です。 DLLを再配置してパフォーマンスを向上させる必要性を減らすために、それぞれ固有のベースアドレスがあり、他のdllと重複しないようにする必要があります。 既定値は実行可能ファイルの場合は0x400000、dllの場合は0x10000000です。

--kill-at

指定すると、stdcall接尾辞(@ nn )は、エクスポートされる前にシンボルから削除されます。

--major-image-versionの

``イメージバージョン ''のメジャー番号を設定します。 デフォルトは1です。

--major-os-versionの

`` os version ''のメジャー番号を設定します。 デフォルトは4です。

--major-subsystem-versionの

``サブシステムバージョン ''のメジャー番号を設定します。 デフォルトは4です。

--minor-image-versionの

``イメージバージョン ''のマイナー番号を設定します。 デフォルトは0です。

--minor-os-versionの

`` os version ''のマイナー番号を設定します。 デフォルトは0です。

--minor-subsystem-versionの

サブシステムバージョンのマイナー番号を設定します。 デフォルトは0です。

--output-def ファイル

リンカは、リンカが生成しているDLLに対応するDEFファイルを含むファイルファイルを作成します。 このDEFファイル( "* .def"と呼ばれる)は、 "dlltool"を使用してインポートライブラリを作成するために使用されるか、または自動的または暗黙的に書き出されたシンボルへの参照として使用されます。

--out-implib ファイル

リンカは、リンカが生成しているDLLに対応するインポートライブラリを含むファイルファイルを作成します。 このインポートlib( "* .dll.a"または "* .a"と呼ばれる)は、クライアントを生成されたDLLとリンクさせるために使用され、別の "dlltool"インポートライブラリの作成手順をスキップすることができます。

- 可能 - 自動イメージベース

"--image-base"引数を使用して指定しない限り、DLLのイメージベースを自動的に選択します。 dllnameから生成されたハッシュを使用して各DLLの固有のイメージベースを作成することで、プログラムの実行を遅延させるメモリ内の衝突や再配置が回避されます。

--disable-auto-image-base

ユニークなイメージベースを自動的に生成しません。 ユーザー指定のイメージベース( " - イメージベース")がない場合は、プラットフォームのデフォルトを使用します。

--dll-search-prefix 文字列

インポートライブラリなしでDLLに動的にリンクするときは、 "lib .dll"よりも " .dll"を検索してください。 この動作により、様々な ``サブプラットフォーム '':native、cygwin、uwin、pwなどのために構築されたDLLを簡単に区別できます。例えば、cygwin DLLは通常 "--dll-search-prefix = cyg"を使います。

--enable-auto-import

DLLからのDATAインポートのための "_symbol"から "__imp__symbol"への洗練されたリンクを行い、それらのDATAexportを使用してインポートライブラリを構築する際に必要なサンク記号を作成します。 これは一般的に「うまくいく」でしょう---しかし時にはあなたはこのメッセージを見るかもしれません:

"変数 ''は自動インポートできません。詳細については、ldの" - enable-auto-import "のマニュアルをお読みください。

このメッセージは、最終的に2つの定数の合計で指定されたアドレスにWin32インポートテーブルがアクセスできる場合に発生します。 これが発生するインスタンスには、DLLからインポートされた構造体変数のメンバフィールドへのアクセスや、DLLからインポートされた配列変数への定数インデックスの使用が含まれます。 マルチワード変数(配列、構造体、long longなど)は、このエラー状態を引き起こす可能性があります。 ただし、問題のエクスポートされた変数の正確なデータ型に関係なく、ldは常にそれを検出し、警告を発行して終了します。

エクスポートされた変数のデータ型に関係なく、この難点に対処するにはいくつかの方法があります。

1つの方法は、 - enable-runtime-pseudo-relocスイッチを使用することです。 これにより、ランタイム環境のクライアントコードに参照を調整する作業が残されるため、このメソッドは、ランタイム環境がこの機能をサポートしている場合にのみ機能します。

2番目の解決方法は、定数の1つを変数にすることです。つまり、コンパイル時には不明で最適化が不可能です。 配列の場合、2つの可能性があります:a)indexee(配列のアドレス)を変数にする、またはb) 'constant'インデックスを変数にする。 従って:

extern型extern_array []; extern_array [1] - > {揮発性タイプ* t = extern_array; t [1]}

または

extern型extern_array []; extern_array [1] - > {volatile int t = 1; extern_array [t]}

構造体(および他のほとんどのマルチワードデータ型)の場合、唯一のオプションは構造体自体(またはlong long、または...)変数を作ることです:

extern構造体extern_struct; extern_struct.field - > {volatile構造体s * t =&extern_struct; t->フィールド}

または

extern long long extern_ll; extern_ll - > {volatile long long * local_ll =&extern_ll; * local_ll}

この難題に対処する第3の方法は、問題のシンボルに対して「自動インポート」を放棄し、それを "__declspec(dllimport)"とマークすることです。 しかし実際には、コンパイル時に#defineを使用して、DLLをビルドするか、DLLにリンクするクライアントコードをビルドするか、単に静的ライブラリにビルド/リンクするかを指定する必要があります。 '一定のオフセットを持つダイレクトアドレス'問題を解決するさまざまな方法の中から選択する際には、典型的な実際の使用法を考慮する必要があります。

元の:

--foo.h extern int arr []; --foo.c #include "foo.h" void main(int argc、char ** argv){printf( "%d \ n"、arr [1]); }

解決策1:

--foo.h extern int arr []; --foo.c #include "foo.h" void main(int argc、char ** argv){/ *この回避策はwin32とcygwinです。 *最適化しない* / volatile int * parr = arr; printf( "%d \ n"、parr [1]); }

解決策2:

(FOO_BUILD_DLL)||定義済み(FOO_STATIC(FOO_BUILD_DLL))| --foo.h / *注意:自動エクスポートは想定されています(__declspec(dllexport)なし)* / #if定義(_WIN32)||定義済み(__ CYGWIN__) ))#define FOO_IMPORT __declspec(dllimport)#else #define FOO_IMPORT #endif extern FOO_IMPORT int arr []; --foo.c #include "foo.h" void main(int argc、char ** argv){printf( "%d \ n"、arr [1]); }

この問題を回避する第4の方法は、問題のある変数(例えば、 set_foo()およびget_foo()アクセサ関数)のデータインターフェイスではなく、機能インターフェイスを使用するようにライブラリを再コーディングすることです。

--disable-auto-import

DLLからのDATAimportsの "_symbol"から "__imp__symbol"への精巧なリンクを試みないでください。

--enable-runtime-pseudo-reloc

コードに--enable-auto-importセクションに記述された式が含まれている場合(つまり、ゼロからオフセットされたDLLからのDATAimports)、このスイッチは実行時環境によって参照を調整するために使用される 'ランタイム擬似再配置'のベクトルを作成しますクライアントコード内のそのようなデータに

--disable-runtime-pseudo-reloc

DLLからのゼロ以外のオフセットのDATAインポートに対して擬似的な再配置を作成しないでください。 これがデフォルトです。

--enable-extra-pe-debug

自動インポートシンボルサンクに関連する追加のデバッグ情報を表示します。

- セクションアライメント

セクションの配置を設定します。 メモリ内のセクションは常にこの番号の倍数であるアドレスから始まります。 デフォルトは0x1000です。

- スタック 予約

--stack 予約 コミット

このプログラムのスタックとして使用するメモリ量を指定します(オプションでコミットします)。 デフォルトは2Mb予約済み、4Kコミット済みです。

- サブシステム

- サブシステム メジャー

- サブシステム メジャー マイナー

プログラムが実行されるサブシステムを指定します。 有効な値は、 "ネイティブ"、 "ウィンドウ"、 "コンソール"、 "posix"です。 オプションでサブシステムのバージョンを設定することもできます。

重要: manコマンド( %man )を使用して、特定のコンピュータでコマンドがどのように使用されているかを確認してください。