日本語 man コマンド類 (ja-man-1.1j_5) と日本語 man ドキュメント (ja-man-doc-5.4 (5.4-RELEASE 用) など) をインストールすると、以下のような man コマンド閲覧、キーワード検索が コンソールからできるようになります。
4.11-RELEASE-K, 5.4-RELEASE-K, 5.5-RELEASE-K, 6.0-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.2-RELEASE-K, 8.0-RELEASE-K は、プライベート版 (小金丸が編集してまとめたもの) ですが、 より多くの翻訳したファイルが含まれています。 (5.4-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.2-RELEASE-K, 8.0-RELEASE-K は、全翻訳済み)
6.4-STABLE-K, 7.2-STABLE-K, 8.0-STABLE-K は現在、 作成中で日々更新されています。 最新の snapshots を元に作成しています。
LD(1) GNU Development Tools LD(1)
名称
ld - GNU リンカ LD の使い方
書式
ld [options] objfile ...
解説
ld は、いくつかのオブジェクトファイルとアーカイブファイルを結合し、その
データを再配置し、シンボルの参照を結びつけます。通常、プログラムのコ ン
パイルの最終段階が、ld を実行することです。
ld は、リンク処理を明示的かつ統合的に制御するために、 AT&T のリンクエ
ディタコマンド言語の文法の上位互換セットで記述されたリンカコマンド言 語
のファイルを受け付けます。
こ のマニュアルページではコマンド言語についてふれません。コマンド言語の
詳細と GNU リンカの別の側面からの詳細については "info" の ld の項、また
はマニュアル ld: the GNU linker を参照してください。
このバージョンの ld は、オブジェクトファイルの操作に汎用の BFD ライブラ
リを使用します。これによって ld は、多くの異なった形式 --- 例えば COFF
や "a.out" のようなオブジェクトファイル --- の読み込み、結合、書き込み
が出来るようになっています。異なる形式のファイルを一緒にリンクして、 任
意の利用可能なオブジェクトファイルを生成できます。
そ の柔軟性の他にも、GNU リンカは、診断情報の提供という点で他のリンカよ
りも役に立ちます。多くのリンカは、エラーを起こした時点で即座に実行を 中
断 してしまいますが、 ld は可能な限り実行を続けるので、他のエラーも突き
止めることができます。 (また、場合によっては、エラーにもかかわらず出 力
ファイルを生成します)。
GNU リンカ ld は、広い範囲の各種状況に対応すること、そして他のリンカと
の互換性をできるだけ維持することを目指しています。そのため、その動作 を
制御するための多くの選択肢があります。
オプション
こ の リ ンカは、おびただしい量のコマンドラインオプションを備えています
が、実際には、いかなる局面においても使用されるオプションは、少ししか あ
り ません。例えば、ld がよく使われるのは、Unix の標準のオブジェクトファ
イルを、 ld がサポートする標準の Unix システム上でリンクする場合で す。
そ のようなシステム上では、"hello.o" というファイルをリンクするためには
以下のようにします:
ld -o <output> /lib/crt0.o hello.o -lc
これは、"/lib/crt0.o" と "hello.o"、そして標準で検索されるディレクト リ
にあるライブラリ "libc.a" をリンクして、output という名前のファイルを生
成することを ld に対して指示しています。
ld に対するいくつかのコマンドラインオプションは、コマンドラインのどこで
で も指定できます。しかし、ファイルを参照する -l や -T のようなオプショ
ンは、オブジェクトファイルやその他のファイルオプションに関連してお り、
コ マンドライン中にオプションが現れた時点でファイルを読みます。ファイル
を取らないオプションを異なる引数を指定して繰返しても、それ以上影響が な
い か、もしくは (コマンドライン上で左にある) それまでの指定を上書きしま
す。 2 回以上指定しても意味のあるオプションは、以下の説明の中で記述され
ています。
オ プション引数ではないものは、一緒にリンクされるオブジェクトファイルか
アーカイブです。それらは、オプションとそのオプションの引数の間に入ら な
い 限り、コマンドラインオプションの前に置いても、後ろに置いても、混ぜて
指定しても構いません。
通常、リンカは少なくとも 1 つのオブジェクトファイルを指定して起動されま
すが、-l や -R を用いて、またはスクリプトコマンド言語使って、他のバイナ
リ形式の入力ファイルを指定することができます。バイナリ入力ファイルが 全
く 指 定されなかった場合、リンカは何も出力をせず、No input files という
メッセージを出します。
リンカがオブジェクトファイルの形式を認識できなかった時は、それをリン カ
ス クリプトと仮定します。このように指定されたスクリプトは、リンクに使わ
れる主リンカスクリプト (デフォルトのリンカスクリプト、もしくは -T で 指
定 さ れ たスクリプト) に追加されます。この機能により、一見オブジェクト
ファイルもしくはアーカイブに見えるが、実際は単にシンボル値を定義して い
る だけだったり、 "INPUT" や "GROUP" を使って他のオブジェクトを読み込ん
でるだけのファイルをリンクすることができます。このように指定されたス ク
リ プトは、主リンカスクリプトに単に追加されるだけということに注意してく
ださい。デフォルトのリンカスクリプトを完全に置き換える場合は、 -T オ プ
ションを使ってください。
1 文字の名前を持つオプションの引数は、間に空白が入らずにオプション文字
に続くか、その引数が必要なオプションのすぐ後に、独立した引数として与 え
られるかしなければなりません。
複 数文字の名前を持つオプションは、 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 リンカが受け入れる一般的なコマンドラインスイッチの一覧です:
-akeyword
こ の オ プションは、HP/UX との互換性のためにサポートされています。
keyword 引数は、文字列 archive, shared または default のどれかで な
ければなりません。 -aarchive は、機能的には -Bstatic と等価であり、
残りの 2 つの keyword は、機能的に -Bdynamic と等価です。この オ プ
ションは何度でも使うことができます。
-Aarchitecture
--architecture=architecture
現在リリースされている ld では、このオプションは Intel 960 ファミリ
のアーキテクチャでのみ使われます。そのような ld の構成で は、archi-
tecture 引数は、 960 ファミリの特定のアーキテクチャを指定し、いくつ
かの保護手段を有効にし、アーカイブライブラリの検索パスを修 正 し ま
す。
将 来の ld のリリースでは、他のアーキテクチャファミリでも同様の機能
をサポートするかもしれません。
-b input-format
--format=input-format
ld は、1 種類以上のオブジェクトファイルをサポートするように構成する
ことができます。もし ld がそのように構成されているなら、-b オプショ
ンで入力するオブジェクトファイルのバイナリ形式を指定することがで き
ま す。その入力ファイルは、コマンドライン上でこのオプションに続けて
指定します。たとえ ld が、他のオブジェクト形式をサポートするよう に
設 定されていても、通常このオプションを指定する必要はありません。と
いうのも、ld は、それぞれマシン上で最も一般的な形式がデフォルトの入
力 形式であると期待するよう設定されているからです。 input-format は
テキスト文字列で、BFD ライブラリでサポートされている特定の形式名 で
す (objdump -i で、使用可能なバイナリ形式名のリストが得られます)。
ファ イルを通常でないバイナリ形式とリンクしたい場合に、このオプショ
ンを使うことができます。 (異なる形式のオブジェクトファイルとリン ク
する時に) 同様に -b で明示的に形式を切り替えられます。その場合は -b
input-format を特定の形式のオブジェクトファイルの各グループの前で指
定します。
デフォルトの形式は、環境変数 "GNUTARGET" から取得されます。
ス クリプトから入力形式を指定する事もでき、その場合はコマンド "TAR
GET" を使います。
-c MRI-commandfile
--mri-script=MRI-commandfile
MRI 製のリンカとの互換性のため、ld は、 GNU ld ドキュメント の MRI
互 換スクリプトファイルの章に記述されているもう一つの制限されたコマ
ンド言語で書かれたスクリプトファイルを受け付けます。オプショ ン -c
で MRI スクリプトファイルを導入した場合は、 -T オプションを用いるこ
とで、汎用目的の ld スクリプト言語で書かれたリンカスクリプトを走 ら
せることができます。 MRI-commandfile がなかった場合、ld は、-L で指
定されたすべてのディレクトリを探します。
-d
-dc
-dp これらの 3 つのオプションは等価です。他のリンカとの互換性のために複
数 の形式がサポートされています。再配置可能なファイルを出力するよう
に (-r によって) 指定された場合でも、コモンシンボルに空間を割り当て
ます。スクリプトコマンドの "FORCE_COMMON_ALLOCATION" も同じ効果を持
ちます。
-e entry
--entry=entry
プログラムの実行開始点を示す明示的なシンボルとして、デフォルトの エ
ン ト リ ポイントの代わりに entry を使用します。シンボル entry がな
かった場合、リンカは entry を数字として解釈しようと試み、それを開始
番 地として使います (数字は基数を 10 として解釈されます。先頭につい
た 0x は 16 を基数とすることを表し、0 は 8 を基数とすることを表しま
す)。
-E
--export-dynamic
動 的にリンクされた実行ファイルを作成する時に、すべてのシンボルを動
的シンボルテーブルに加えます。動的シンボルテーブルは、実行時に動 的
オブジェクトから見えるシンボルのテーブルです。
も しこのオプションを使用しなかった場合、通常、動的シンボルテーブル
には、リンク中に指定されたいくつかの動的オブジェクトから参照され る
シンボルのみが含まれます。
他 の動的オブジェクトではなく、そのプログラムで定義されているシンボ
ルを参照し返す必要のある動的オブジェクトを "dlopen" でロードする 場
合 は、おそらくプログラム自身をリンクする時にこのオプションを使う必
要があるでしょう。
出力形式がサポートしていた場合、バージョンスクリプトを使って、ど の
シ ン ボ ル を 動 的 シンボルテーブルに追加すべきかを制御できます。
@ref{VERSION} 中の --version-script の記述を参照してください。
-EB ビッグエンディアンのオブジェクトをリンクします。これはデフォルト の
出力形式に影響します。
-EL リトルエンディアンのオブジェクトをリンクします。これはデフォルトの
出力形式に影響します。
-f
--auxiliary name
ELF の共有オブジェクトを生成する際に、内部の DT_AUXILIARY フィー ル
ド に、指定した name を設定します。これは、共有オブジェクトのシンボ
ルテーブルを、共有オブジェクト name のシンボルテーブルに適用する 補
助のフィルタとして使う事を、動的リンカに対して指示します。
後 からこのフィルタオブジェクトに対してプログラムをリンクした場合、
そのプログラムを実行した時に、動的リンカは DT_AUXILIARY フィール ド
を 見ます。動的リンカがフィルタオブジェクトからのシンボルを解決する
場合は、共有オブジェクト name の中に定義があるかどうかをまず チェッ
ク します。もしそれがあった場合は、フィルタオブジェクト中の定義の代
わりに使用されます。共有オブジェクト name は、存在しなくても構い ま
せ ん。このようにして共有オブジェクト name は、おそらくデバッギング
やマシン特有のパフォーマンスといったある機能の別の実装を提供する た
めに使用できます。
このオプションは 2 回以上指定されても構いません。 DT_AUXILIARY エン
トリは、コマンドラインに現れた順番に生成されます。
-F name
--filter name
ELF の共有オブジェクトを生成する際に、内部の DT_FILTER フィー ル ド
に、 指定した name を設定します。これは、共有オブジェクトのシンボル
テーブルを、共有オブジェクト name のシンボルテーブルに適用する フィ
ルタとして使う事を、動的リンカに対して指示します。
後 からこのフィルタオブジェクトに対してプログラムをリンクした場合、
そのプログラムを実行した時に、動的リンカは DT_FILTER フィールドを見
ま す。動的リンカは、通常のようにフィルタオブジェクトのシンボルテー
ブルに従ってシンボルを解決しますが、実際には共有オブジェク ト name
中 に見つかった定義にリンクします。このようにしてフィルタオブジェク
トは、オブジェクト name によって提供されたシンボルのサブセットを 選
択するのに使用できます。
い くつかの古いリンカは、コンパイルツールチェーンを通して、 -F オプ
ションを、入力および出力オブジェクトファイル両方の形式を指定する た
めに使っていました。 GNU リンカは、この目的に別のメカニズムを用いて
います。それは -b, --format, --oformat オプションや、リンカスクリプ
ト 中の "TARGET" コマンド、そして "GNUTARGET" 環境変数です。 GNU リ
ンカは、ELF 共有オブジェクトを作らない時には、 -F オプションを無 視
します。
-fini name
ELF の実行形式もしくは共有オブジェクトを生成する際、関数のアドレス
に DT_FINI を設定することにより、実行形式もしくは共有オブジェクトが
ア ン ロー ド さ れる時に NAME を呼びます。デフォルトでは、リンカは
"_fini" を、呼ぶべき関数として使用します。
-g 無視されます。これは他のツールとの互換性のために提供されています。
-Gvalue
--gpsize=value
GP レジスタを使用して最適化されるオブジェクトの最大サイズを size に
設 定します。これは、大きいオブジェクトと小さいオブジェクトを異なる
セクションに配置することをサポートしている MIPS ECOFF のようなオ ブ
ジェ クトファイル形式の場合のみ意味を持ちます。他のオブジェクトファ
イル形式の場合は無視されます。
-hname
-soname=name
ELF の共有オブジェクトを生成する際に、内部の DT_SONAME フィー ル ド
に、指定した name を設定します。実行形式が DT_SONAME フィールドを持
つ共有オブジェクトとリンクされると、実行形式が実行される時に、動 的
リンカはリンカに与えられたファイル名を使う代わりに DT_SONAME フィー
ルドで指定された共有オブジェクトをロードしようとします。
-i インクリメンタルリンクを行います (オプション -r と同じです)。
-init name
ELF の実行形式もしくは共有オブジェクトを生成する際、関数のアドレ ス
に DT_INIT を設定することにより、実行形式もしくは共有オブジェクトが
ロードされる時に NAME を呼びます。デフォルトでは、リンカは "_init"
を、呼ぶべき関数として使用します。
-larchive
--library=archive
アーカイブファイル archive を、リンクすべきファイルのリストに追加し
ます。このオプションは、何度指定しても構いません。 ld は、archive
が指定されるたびに "libarchive.a" を自身のパスリストから探します。
共 有 ラ イ ブ ラリをサポートするシステムでは、ld は、".a" 以外のサ
フィックスを持つライブラリも探すことがあります。特に ELF や SunOS
シ ステムでは、ld は、".a" というサフィックスを持つライブラリを探す
前に、".so" というサフィックスを持つライブラリをディレクトリから 探
します。慣習により、".so" サフィックスは共有ライブラリを示します。
リンカは、コマンドラインで指定されたその場所でのみ、 1 回だけアーカ
イブを検索します。もしそのアーカイブが、それまでにコマンドライン に
現 れたオブジェクトでは定義していないシンボルを定義していた時は、リ
ンカは、そのアーカイブから適切なファイルを取り込みます。しかし、 コ
マ ン ド ラインに後から現れたオブジェクトに含まれる未定義シンボルに
よって、リンカがアーカイブを再度検索することはありません。
アーカイブを複数回検索するようリンカに強制する方法は、 -( オプ ショ
ンを参照してください。
同じアーカイブをコマンドライン上に複数回指定しても構いません。
こ の種のアーカイブ検索は、Unix のリンカでは普通です。しかし AIX 上
で ld を使用する場合、AIX リンカとは異なった動作をするので注意が 必
要です。
-Lsearchdir
--library-path=searchdir
パ ス searchdir を、ld がアーカイブライブラリや ld の制御スクリプト
を検索するのに使用するパスのリストに追加します。このオプション は、
何 度指定しても構いません。ディレクトリは、コマンドライン上で指定さ
れた順に検索されます。コマンドライン上で指定されたディレクトリ は、
デ フォルトのディレクトリの前に検索されます。すべての -L オプション
は、オプションの出現した順番によらず、すべての -l オプションに適 用
されます。
(-L で 指定されない) デフォルトの検索パスの組は、 ld がどのエミュ
レーションモードを使っているか、そして場合によってはどのように構 成
されたかに依存します。
パ スは、リンクスクリプト中で "SEARCH_DIR" コマンドを用いても指定で
きます。この方法で指定されたディレクトリは、コマンドライン上でリ ン
カスクリプトが現れた時点で検索されます。
-memulation
emulation リンカをエミュレートします。 --verbose や -V オプション
で、利用可能なエミュレーションをリストできます。
-m オプションが指定されていない場合、エミュレーションは、 "LDEMULA
TION" 環境変数が定義されていればそこから取得されます。
そ れ以外の場合、デフォルトのエミュレーションは、リンカがどのように
構成されたかに依存します。
-M
--print-map
リンクマップを標準出力に表示します。リンクマップは、以下を含むリ ン
クの情報を提供します:
+ オ ブ ジェ クトファイルとシンボルが、メモリのどこにマップされる
か。
+ コモンシンボルがどのように割り当てられたか。
+ リンクに含まれるすべてのアーカイブメンバ、およびそのアーカイ ブ
メンバを取り込むきっかけとなったシンボル。
-n
--nmagic
セ ク ショ ン の ページアラインメントを無効にし、可能であれば出力に
"NMAGIC" と印を付けます。
-N
--omagic
テキストセクションとデータセクションを読み書き可能に設定します。 ま
た、 データセグメントのページアラインメントも行いません。出力形式が
Unix 形式のマジックナンバをサポートしている場合、出力に "OMAGIC" と
印を付けます。
-o output
--output=output
output を、ld によって生成されるプログラムの名前として使用します。
このオプションが指定されなかった場合、a.out という名前がデフォル ト
で 使用されます。スクリプトコマンドの "OUTPUT" によっても、出力ファ
イル名を指定することができます。
-O level
level が 0 より大きい数値であった場合、 ld は出力を最適化します。こ
れ にはとても長い時間がかかりますので、最終的なバイナリの作成時のみ
有効にするべきでしょう。
-q
--emit-relocs
最終的にリンクされた実行形式中に、再配置セクションと内容を 残 し ま
す。 これらの情報は、リンク後の分析・最適化ツールが実行形式を正しく
変更するのに必要となるでしょう。これは、より大きな実行形式を生成 し
ます。
このオプションは、現在 ELF プラットフォームでしかサポートされていま
せん。
-r
--relocateable
再配置可能な出力を生成します。つまり、ld への入力として利用できる出
力 ファイルを生成します。これはよく 部分リンク と呼ばれます。この副
作用として、Unix の標準のマジックナンバをサポートする環境では、この
オ プションは出力ファイルのマジックナンバを "OMAGIC" に設定します。
このオプションが指定されなかった場合は、絶対アドレス値を用いた ファ
イルが生成されます。 C++ プログラムをリンクする場合、このオプション
はコンストラクタへの参照を解決しません。そのような場合は -Ur を使用
してください。
入 力ファイルが出力ファイルと同じ形式ではない場合、部分リンクは、入
力ファイルが再配置セクションを全く持たない時のみサポートされま す。
異 なった出力形式は、さらなる制限を持つことがあります。例えば、ある
"a.out" ベースの形式は、入力ファイルが異なった形式であった時に は、
部分リンクを全くサポートしません。
このオプションは、-i と同じです。
-R filename
--just-symbols=filename
シ ンボル名やそのアドレスを filename から読み込みますが、それを再配
置したり出力に含めることはしません。これにより、出力ファイルが他 の
プ ログラムで定義されたメモリの絶対位置をシンボルで参照できるように
なります。このオプションは 2 回以上使って構いません。
他の ELF リンカとの互換性のため、-R オプションの後にファイル名で は
な く ディ レクトリ名が続いた場合、 -rpath オプションとして扱われま
す。
-s
--strip-all
すべてのシンボル情報を出力ファイルから削除します。
-S
--strip-debug
(すべてのシンボルではなく) すべてのデバッグ用シンボル情報を出力ファ
イルから削除します。
-t
--trace
ld が入力ファイルを処理するたびに、入力ファイル名を表示します。
-T scriptfile
--script=scriptfile
scriptfile をリンカスクリプトとして使用します。このスクリプトは、(
追加されるのではなく) ld のデフォルトのリンカスクリプトを置き換えま
す。 したがって、scriptile には、出力ファイルを記述するのに必要なす
べてのことを指定しなければなりません。 scriptfile がカレントディ レ
ク トリに存在しない場合、 "ld" は、すべての -L オプションに続いて指
定されたディレクトリを検索します。複数の -T オプションは、一つに ま
とめられます。
-u symbol
--undefined=symbol
強 制的に symbol を未定義シンボルとして出力ファイルに含めます。こう
することによって、例えば標準ライブラリからさらにモジュールをリン ク
する引き金とすることができます。異なるオプション引数を持つことで -u
を繰返し指定することができ、未定義シンボルを追加します。こ の オ プ
ションは、"EXTERN" リンカスクリプトコマンドと同じです。
-Ur C++ プログラム以外に対しては、このオプションは -r と同じです。再配
置可能な出力、つまり ld に再度入力可能な出力ファイルを生成しま す。
C++ プログラムをリンクする場合、-r とは異なり、 -Ur はコンストラク
タへの参照を解決します。 -Ur を使用してリンクされたファイルに対して
は、 -Ur を使用できません。コンストラクタのテーブルが一度生成される
と、追加することができないのです。 -Ur は、最後の部分リンクのみに使
用するようにして、その他の場合は -r を使用してください。
--unique[=SECTION]
SECTION に一致した入力セクション毎に、個別の出力セクションを生成し
ます。オプションのワイルドカード SECTION 引数がない場合は、親なし入
力 セクション毎に、個別の出力セクションを生成します。親なしセクショ
ンとは、リンカスクリプト中に明示的に記述されていないセク ショ ン で
す。 このオプションは、コマンドライン上で複数回使用できます。これに
よって、通常の同名の入力セクションのマージを行わないようにしま す。
こ れは、リンカスクリプト中での出力セクションの割り当てを上書きしま
す。
-v
--version
-V ld のバージョン番号を表示します。 -V オプションは、サポートしている
エミュレータの一覧も表示します。
-x
--discard-all
すべてのローカルシンボルを削除します。
-X
--discard-locals
す べての一時的なローカルシンボルを削除します。ほとんどのターゲット
において、それは名前が L で始まるすべてのローカルシンボルです。
-y symbol
--trace-symbol=symbol
リンクされたファイルのうち、symbol が現れるファイル名を表示します。
こ のオプションは何度でも指定できます。多くのシステム上では、シンボ
ル名の前にアンダスコアをつける必要があるでしょう。
このオプションは、リンク中に未定義シンボルが発見されたが、それが ど
こから参照されているのかがわからない場合に役に立ちます。
-Y path
デ フォルトのライブラリ検索パスに path を追加します。このオプション
は、Solaris との互換性のために存在します。
-z keyword
認識される キー ワー ド は、"initfirst", "interpose", "loadfltr",
"nodefaultlib", "nodelete", "nodlopen", "nodump", "now", "origin",
"combreloc", "nocombreloc", "nocopyreloc" です。 他 の キー ワー ド
は、Solaris との互換性のために無視されます。 "initfirst" は、実行時
にそのオブジェクトが他のオブジェクトよりも先に初期化されるという 印
を 付 けます。 "interpose" は、主実行形式以外のすべてのシンボルの前
に、そのオブジェクトのシンボルテーブルを挿入するという印を 付 け ま
す。 "loadfltr" は、実行時にそのオブジェクトのフィルタが直ちに実行
されるという印を付けます。 "nodefaultlib" は、このオブジェクトの 依
存 関係を検索する際、デフォルトのライブラリ検索パスを無視するという
印を付けます。 "nodelete" は、そのオブジェクトが実行時にアンロー ド
さ れ な い と いう印を付けます。 "nodlopen" は、そのオブジェクトに
"dlopen" を適用できないという印を付けます。 "nodump" は、その オ ブ
ジェ ク ト が "dldump" によってダンプできないという印を付けます。
"now" は、そのオブジェクトが実行時遅延バインディングではないとい う
印を付けます。 "origin" は、そのオブジェクトが $ORIGIN を含んでいる
かもしれないという印を付けます。 "defs" は、未定義シンボルを許可 し
ま せん。 "muldefs" は複数回の定義を許可します。 "combreloc" は、複
数の再配置可能セクションを結合し、ソートして、動的シンボル 検 索 の
キャッ シュ を可能にします。 "nocombreloc" は、複数の再配置可能セク
ションの結合を無効にします。 "nocopyreloc" は、再配置可能セクション
の複製の生成を無効にします。
-( archives -)
--start-group archives --end-group
archives は、アーカイブファイルのリストを指定します。これらはファイ
ル名そのものでも、-l オプションでも構いません。
指定されたアーカイブは、新たな未定義参照がなくなるまで繰返し検索 さ
れます。通常、アーカイブは、コマンドラインで指定された順番で 1 回だ
け検索されます。そのアーカイブ中のシンボルが、コマンドライン上の 後
ろ に現れたアーカイブ中のオブジェクトが参照する未定義シンボルを解決
するのに必要な場合、リンカはその参照を解決することができ ま せ ん。
アー カイブをグループ化すると、すべての可能な参照が解決されるまで、
それらのすべてのアーカイブは繰返し検索されます。
このオプションを使用すると、パフォーマンスが大きく落ちます。これ を
使 うのは、2 つ以上のアーカイブ中で、参照の循環が避けられない場合の
みに使用するのがよいでしょう。
-assert keyword
このオプションは、SunOS との互換性のために無視されます。
-Bdynamic
-dy
-call_shared
動的ライブラリとリンクします。これは、共有ライブラリをサポートす る
プ ラットフォーム上でのみ意味を持ちます。このオプションは、そのよう
なプラットフォーム上では、普通デフォルトとなっています。こ の オ プ
ショ ンに異なる形式があるのは、様々なシステムとの互換性のためです。
このオプションは、コマンド上で何度でも使用することができます。こ れ
は後に続く -l オプションのライブラリ検索に影響します。
-Bgroup
動 的セクション中の "DT_FLAGS_1" エントリの "DF_1_GROUP" フラグを設
定します。これによって、動的リンカがこのオブジェクトとその依存関 係
の 検索をグループ内でのみ実行するようになります。 --no-undefined が
暗黙に指定されます。このオプションは、共有ライブラリをサポートす る
ELF プラットホーム上でのみ意味を持ちます。
-Bstatic
-dn
-non_shared
-static
共 有ライブラリをリンクしません。これは、共有ライブラリをサポートす
るプラットフォーム上でのみ意味を持ちます。このオプションに異なる 形
式 が あ るのは、様々なシステムとの互換性のためです。このオプション
は、コマンドライン上で何度でも使用することができます。これは後に 続
く -l オプションのライブラリ検索に影響します。
-Bsymbolic
共 有ライブラリを生成する際に、その共有ライブラリ中に定義があれば、
グローバルシンボルへの参照をその定義に結びつけます。通常、共有ラ イ
ブ ラリをリンクしたプログラムは、その共有ライブラリ中の定義を上書き
できます。このオプションは、共有ライブラリをサポートする ELF プラッ
トホーム上でのみ意味を持ちます。
--check-sections
--no-check-sections
セ クションアドレスが割り当てられた後、それらのアドレスが重なってい
ないかどうかのチェックをしないようリンカに指示します。通常、リン カ
は チェックを行い、重なりを発見した時は適切なエラーメッセージを出力
します。リンカは、オーバレイセクションのことを知っており、それを 生
成 することを許可します。コマンドラインスイッチ --check-sections を
使用することで、デフォルトの動作に戻せます。
--cref
相互参照テーブルを出力します。リンカマップファイルが生成さ れ る 場
合、 相 互 参照テーブルはマップファイルに出力されます。それ以外の場
合、標準出力に出力されます。
テーブル形式は、意図的に簡単にしているので、必要な場合はスクリプ ト
で 簡単に処理することができます。シンボルは、名前でソートされて出力
されます。それぞれのシンボル毎に、ファイル名がリストされます。シ ン
ボ ルが定義されている場合は、リストの最初のファイルにその定義が含ま
れています。残りのファイルは、そのシンボルへの参照を含んでいます。
--no-define-common
このオプションは、コモンシンボルへのアドレス割り当てを抑制しま す。
スクリプトコマンド "INHIBIT_COMMON_ALLOCATION" は、同じ効果を持ちま
す。
--no-define-common オプションは、コモンシンボルへアドレスを割り当て
る 判断を、出力ファイルのタイプの選択から切り離します。このオプショ
ンを指定しない場合は、再配置不可の出力タイプによって、アドレスは 強
制 的にコモンシンボルへ割り当てられます。 --no-define-common を使用
することにより、共有ライブラリから参照されるコモンシンボルは、主 プ
ロ グラムのアドレスのみに割り当てられます。このオプションは、共有ラ
イブラリ中の重複した未使用領域を削除します。また、動的シンボル解 決
す るために特殊な検索パスを持つたくさんの動的モジュールがある場合、
間違った重複を解決する際に起こり得る混乱を防ぎます。
--defsym symbol=expression
expression で指定される絶対アドレスを含んだグローバルシンボルを、出
力 ファイルに生成します。複数のシンボルを定義するために、コマンドラ
イン上で必要な回数だけこのオプションを使用できます。 expression に
は、 限定された形式の算術演算がサポートされてます。 16 進定数や存在
するシンボル名が使用でき、 16 進定数やシンボルの加減算に "+" や "-"
を 使用できます。もっと複雑な式が必要であれば、スクリプトからリンカ
のコマンド言語を使用することを検討してください。 注意: symbol や 等
号 (``='')、expression の間に空白を入れてはいけません。
--demangle[=style]
--no-demangle
こ れらのオプションは、エラーメッセージやその他の出力に含まれるシン
ボル名をデマングルするかどうかを制御します。デマングルする場合、 リ
ン カはシンボル名を読みやすい形式で表現しようと試みます。つまりリン
カは、先頭のアンダスコアがオブジェクトファイル形式で使用されてい た
場 合、それを取り除き、C++ のマングルされたシンボル名をユーザが読み
やすい名前に変換します。コンパイラによってマングル形式は異 な り ま
す。 デマングル形式引数を指定することにより、使用しているコンパイラ
に対応したデマングル形式を選択できます。リンカは、環 境 変 数 COL-
LECT_NO_DEMANGLE が設定されていない限り、デフォルトでデマングルしま
す。これらのオプションによって、デフォルトを上書きできます。
--dynamic-linker file
動的リンカの名前を設定します。これは、動的にリンクされる ELF 実行形
式 を生成する時のみ意味があります。通常は、デフォルトの動的リンカで
正しいはずです。自分が何をしようとしているのかがわかってる場合以 外
は、使用しないでください。
--embedded-relocs
こ のオプションは、GNU コンパイラとアセンブラに -membedded-pic オプ
ションを指定して生成した MIPS の埋め込み PIC コードをリンクする時の
み 意味があります。これを指定すると、リンカはあるテーブルを生成しま
す。このテーブルは、ポインタの値に静的に初期化されているす べ て の
デー タ を、 実 行 時 に 再 配置するために使われます。詳細は、test
suite/ld-empic のコードを参照してください。
--fatal-warnings
すべての警告を、エラーとして扱います。
--force-exe-suffix
出力ファイルのサフィックスが .exe となるようにします。
このオプションを指定すると、無事に生成され完全にリンクされ た 出 力
ファ イルに ".exe" や ".dll" というサフィックスがついていなかった場
合、リンカは出力ファイルを、同じ名前に ".exe" サフィックスをつけ た
ファ イルにコピーします。このオプションは、Microsoft Windows ホスト
上で、未修正の Unix 用の makefile を使用する場合に便利です。とい う
の も、Windows のいくつかのバージョンでは、 ".exe" サフィックスがつ
いていないイメージを実行できないからです。
--no-gc-sections
--gc-sections
未使用の入力セクションのガーベージコレクションを有効にします。こ の
オ プションをサポートしていないターゲット上では無視されます。このオ
プションは、-r とは互換性がありませんし、動的リンクと一緒に使うべき
で もありません。デフォルトの動作 (ガーベージコレクションを実行しな
い) に戻すには、コマンドラインで --no-gc-sections を指定してくだ さ
い。
--help
コマンドラインオプションの概要を標準出力に表示し、終了します。
--target-help
ターゲット固有のオプションの要約を標準出力に表示し、終了します。
-Map mapfile
リンクマップをファイル mapfile へ出力します。前出の -M オプションの
記述を参照してください。
--no-keep-memory
通常 ld は、入力ファイルのシンボルテーブルをメモリにキャッシュす る
こ とで、メモリ使用量よりも速度を優先します。このオプションを指定す
ると、ld は、必要に応じてシンボルテーブルを読むことで、メモリ使用量
を最小にします。これは、大きな実行形式をリンクする際に、ld がメモリ
空間を使い果たしてしまうような場合に必要となります。
--no-undefined
-z defs
通常、非シンボル的共有ライブラリを作成する場合、未定義シンボルは そ
の まま置いておかれ、実行時ローダによって解決されます。これらのオプ
ションは、そのような未定義シンボルを許しません。
--allow-multiple-definition
-z muldefs
通常、シンボルが複数回定義されると、リンカは致命的なエラーを報告 し
ま す。これらのオプションは複数回の定義を許し、最初の定義を使用する
ようになります。
--allow-shlib-undefined
--no-undefined が設定されていても、共有オブジェクト中の未定義シンボ
ル を許可します。この実際の結果は、通常のオブジェクト中の未定義シン
ボルはエラーを引き起こしますが、共有オブジェクト中の未定義シンボ ル
は 無視されます。 no_undefined の実装は、未定義シンボルによって動的
リンカが詰まってしまうことを想定しています。しかし、共有ライブラ リ
に 未定義シンボルが含まれてるのが正常であるシステムが、少なくとも 1
つ (BeOS) あります。このシステムでは、現在のアーキテクチャに最も 適
切 な関数を選択するよう、ロード時にカーネルがパッチを当てます。つま
り、最も適切な memset 関数を動的に選択するのです。どうやら HPPA 共
有ライブラリに未定義シンボルが含まれるのも普通のことのようです。
--no-undefined-version
通 常は、シンボルが未定義バージョンを持つ場合、リンカはこれを無視し
ます。このオプションは、未定義バージョンのシンボルを許さず、代り に
致命的なエラーを報告します。
--no-warn-mismatch
通 常 ld は、不適当な入力ファイルをリンクしようとした場合、エラーを
発します。例えば、異なるプロセッサ向け、もしくは異なるエンディア ン
向 けにコンパイルされたものであるという場合です。このオプションを指
定すると、ld は、このような起き得るエラーをだまって許可します。この
オ プションは、リンカのエラーが適切でないと分かっている特殊なことし
た時のみ使用し、使用の際には注意しなくてはなりません。
--no-whole-archive
以後に続くアーカイブファイルに対して、 --whole-archive オプションの
効果を無効にします。
--noinhibit-exec
利 用可能ならいつも、実行形式の出力ファイルを残しておきます。普通リ
ンカは、リンク処理中にエラーが発生した場合、出力ファイルを生成し ま
せん。どんなエラーが発生しても、出力ファイルを書かずに終了します。
-nostdlib
コ マンドライン上で明示的に指定されたライブラリディレクトリのみを検
索します。リンカスクリプト中で指定されたライブラリディレクトリ は、
(コマンドライン上で指定されたリンカスクリプトであっても) 無視されま
す。
--oformat output-format
ld は、2 種類以上のオブジェクトファイルをサポートするように構成する
こ とができます。 ld がそのように構成されていた場合、--oformat オプ
ションを用いて、出力ファイルのバイナリ形式を指定することが で き ま
す。 しかし ld が別のオブジェクト形式をサポートするよう構成されてい
たとしても、通常はこのオプションを指定する必要はありません。とい う
のも、ld は、それぞれのマシン上で最もありふれた形式をデフォルトの出
力形式とするよう構成されているはずだからです。 output-format はテキ
ス ト文字列で、BFD ライブラリによってサポートされている特定の形式の
名前です (objdump -i を用いて、利用可能なバイナリ形式をリストできま
す)。 スクリプトコマンド "OUTPUT_FORMAT" でも、出力形式を指定するこ
とができますが、このオプションによって上書きされます。
-qmagic
このオプションは、Linux 互換性のために無視されます。
-Qy このオプションは、SVR4 互換性のために無視されます。
--relax
マシン依存の効果を持つオプションです。このオプションをサポートし て
いるターゲットは、少数です。
い くつかのプラットホームでは、--relax オプションは、リンカがプログ
ラム中のアドレッシングを解決できる場合に可能となる大域的な最適化 を
実 行します。これは、出力オブジェクトファイル中のアドレスモードの緩
和や、新規命令の合成などです。
いくつかのプラットホーム上では、このようなリンク時の大域的な最適 化
に よって、生成された実行形式のシンボリックデバッグが不可能となる場
合があります。不可能になることが知られているのは、松下の MN10200 や
MN10300 プロセッサファミリです。
これがサポートされていないプラットホームでは、 --relax は受け付けら
れますが、無視されます。
--retain-symbols-file filename
ファイル filename 中にリストされたシンボルのみを残し、他のシンボ ル
をすべて破棄します。 filename は、1 行毎に 1 つのシンボル名が書いて
ある単なる平坦なファイルです。このオプションは特に、実行時のメモ リ
を節約するために、 1 つの大きい大域的なシンボルテーブルが徐々に増え
ていく (VxWorks のような) 環境で役にたちます。
--retain-symbols-file は、未定義シンボルや再配置に必要なシンボル は
廃棄しません。
--retain-symbols-file は、コマンドライン上で 1 回しか指定することが
できません。これは、-s や -S を無効にします。
-rpath dir
実行時ライブラリ検索パスへディレクトリを追加します。これは、ELF 実
行 形 式 を 共 有オブジェクトとリンクする時に使用されます。すべての
-rpath の引数は結合され、動的リンカに渡されます。動的リンカは、これ
ら を用いて実行時に共有オブジェクトを検索します。 -rpath オプション
は、明示的にリンクされる共有オブジェクトによって必要とされる共有 オ
ブジェクトを検索するのにも使用されます。これについては、-rpath-link
オプションの記述を参照してください。 ELF 実行形式をリンクする 時 に
-rpath が使用されてない場合、環境変数 "LD_RUN_PATH" の内容が定義さ
れていれば、それが使われます。
-rpath オプションは、SunOS 上でも使用されます。 SunOS 上ではデ フォ
ル トで、リンカは指定されたすべての -L オプションから実行時検索パス
を作成します。 -rpath オプションが指定された場合、実行時検索パス は
-L オプションを無視し、-rpath オプションのみを用いて作成されます。
このオプションは、gcc を使用する時に役に立ちます。という の は、gcc
は沢山の -L オプションを追加し、それは NFS マウントされたファイルシ
ステム上にあるかもしれないからです。
他の ELF リンカとの互換性のために、-R オプションの後にファイル名 で
は なくディレクトリ名が続いた場合、 -rpath オプションとして扱われま
す。
-rpath-link DIR
ELF もしくは SunOS を使用した場合、ある共有ライブラリがもう 1 つ 別
の共有ライブラリを要求することがあります。これは、"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 が存在していたら、そのファイル中のディレクト リ
のリスト。
要 求された共有ライブラリが見つからない場合、リンカは警告を出しリン
クを継続します。
-shared
-Bshareable
共有ライブラリを作成します。現在これは、ELF, XCOFF, SunOS 上のみ で
サ ポートされています。 SunOS 上では、-e オプションが使用されておら
ず、リンク時に未定義シンボルが存在していれば、リンカは自動的に共 有
ライブラリを作成します。
--sort-common
こ の オプションを指定すると、ld は、コモンシンボルを適切な出力セク
ションに配置する際にサイズでソートします。最初にすべての 1 バイトの
シンボルが配置され、次にすべての 2 バイトのシンボル、そしてすべての
4 バイトのシンボル、そしてその他のシンボルが配置されます。このよ う
に するのは、アラインメントの制約によってシンボルの間に隙間が生じる
のを防ぐためです。
--split-by-file [size]
--split-by-reloc と同じですが、各々の入力ファイルに対し、 size に達
す るたびに新しい出力セクションを作成します。 size が指定されなかっ
た場合、デフォルトのサイズは 1 です。
--split-by-reloc [count]
ファイル中の 1 つの出力セクションが、count より多い再配置情報を含ま
な いよう、出力ファイル中に余分なセクションを作成しようとします。こ
れは、COFF オブジェクト形式のリアルタイムカーネルにダウンロードする
た めの巨大な再配置可能ファイルを作成する時に役に立ちます。というの
も、COFF では 1 つのセクションは 65535 を越える再配置情報を表現する
こ とができないからです。このオプションは、任意のセクションをサポー
トしていないオブジェクトファイル形式では、うまくいかないことに注 意
し てください。リンカは、分配し直す際に個々の入力セクションを分割し
ないので、 1 つの入力セクションが count を越える再配置情報を含ん で
いる場合、 1 つの出力セクションには、それだけの数の再配置情報を含む
ことになります。 count のデフォルト値は 32768 です。
--stats
実行時間やメモリ使用量などといったリンカの処理に関する統計情報 を、
計算し出力します。
--traditional-format
ターゲットによっては、ld の出力が既存のリンカの出力といくつかの点で
異なることがあります。このスイッチを指定すると、 ld は既存のリン カ
の形式を使います。
例 えば SunOS 上では、ld はシンボル文字列テーブル内の重複したエント
リを 1 つにします。これによって、完全なデバッグ情報を持つ出力ファイ
ル の サ イ ズが、 30% 以上も小さくなります。残念なことに、SunOS の
"dbx" プログラムは、生成されたファイルを読み込むことができ ま せ ん
("gdb" では問題ありません)。 --traditional-format スイッチを指定す
ると、重複したエントリを 1 つにまとめません。
--section-start sectionname=org
出力ファイル中のセクションを、org で指定された絶対アドレスに配置 し
ま す。複数のセクションを配置させる場合、このオプションは、必要に応
じてコマンドライン中に何度でも指定することができます。 org は、単独
の 16 進数でなければなりません。他のリンカとの互換性のために、16 進
数の先頭に通常つける 0x を省略することができます。 sectionname と等
号 (``='')、org の間には空白をはさむことができないことに注意してく
ださい。
-Tbss org
-Tdata org
-Ttext org
org を、出力ファイル中の "bss"、 "data"、 "text" セグメント の ---
そ れぞれ --- の開始アドレスとします。 org は、単独の 16 進数でなけ
ればなりません。他のリンカとの互換性のために、16 進数の先頭に通常つ
ける 0x を省略することができます。
--dll-verbose
--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. シンボルに対する定義が既に存在するため、コモンシンボルを参照 に
変換します。
<file>(<section>): warning: common of `<symbol>'
overridden by definition
<file>(<section>): warning: defined here
2. シンボルに対する定義が後から現れたため、コモンシンボルを参照に
変換します。これは上記のケースと同様ですが、シンボルの現れた 順
番が違います。
<file>(<section>): warning: definition of `<symbol>'
overriding common
<file>(<section>): warning: common is here
3. コモンシンボルを、既出の同じサイズのコモンシンボルにマージしま
す。
<file>(<section>): warning: multiple common
of `<symbol>'
<file>(<section>): warning: previous common is here
4. コモンシンボルを、既出の、より大きいコモンシンボルにマージし ま
す。
<file>(<section>): warning: common of `<symbol>'
overridden by larger common
<file>(<section>): warning: larger common is here
5. コモンシンボルを、既出の、より小さいコモンシンボルにマージしま
す。これは上記のケースと同様ですが、シンボルの現れた順番が違 い
ます。
<file>(<section>): warning: common of `<symbol>'
overriding smaller common
<file>(<section>): warning: smaller common is here
--warn-constructors
グ ロー バルコンストラクタが 1 つでも使われていた場合、警告を出しま
す。これが役に立つファイル形式はわずかです。 COFF や ELF のような形
式 では、リンカはグローバルコンストラクタが使用されていることを検知
できません。
--warn-multiple-gp
複数のグローバルポインタ値が出力ファイル中で必要とされる場合、警 告
を 出します。このオプションは、Alpha などの特定のプロセッサでのみ意
味があります。具体的に言うと、プロセッサの中には特別なセクション 中
に 大きな値の定数を置くものがあります。ある特殊なレジスタ (グローバ
ルポインタ) がこのセクションの中央を指しており、ベースレジスタ相 対
の アドレッシングモードを使用して、定数を効率的に読み込むことができ
ます。ベースレジスタ相対モードのオフセットが、固定で比較的小さい (
例 えば 16bit) ため、これによって定数領域の最大サイズが制限されてし
まいます。従って、大きなプログラムでは、すべての定数を参照するた め
に 複数のグローバルポインタ値を使うことがしばしば必要となります。こ
のオプションを指定すると、このようなケースが起きた時に警告を出し ま
す。
--warn-once
そ れぞれの未定義シンボルに対して、それを参照しているモジュール毎に
警告を出すのではなく、ただ 1 度だけ警告を出します。
--warn-section-align
アラインメントによって出力セクションのアドレスが変更された場合、 警
告 を出します。一般的には、アラインメントはインプットセクションによ
り設定されます。アドレスが変更されるのは、それが明示的に指定され な
かった場合だけです。すなわち、"SECTIONS" コマンドが、そのセクション
の開始アドレスを指定しなかった場合です。
--whole-archive
コマンドライン上で --whole-archive オプションの後に指定された各アー
カ イブに対して、そのアーカイブファイルの中の必要なオブジェクトファ
イルだけを検索するのではなく、アーカイブ中のすべてのオブジェクト を
リ ンクに含めます。これはアーカイブを共有ライブラリに変換する時に普
通使用され、生成する共有ライブラリ中にすべてのオブジェクトを強制 的
に取り込みます。このオプションは、2 回以上使用しても構いません。
このオプションを gcc から使用する際に、2 つ注意することがあります。
1 つめは、gcc は こ の オ プ ショ ン を 知 り ま せ ん。 で す か
ら、-Wl,-whole-archive と指定しなければなりません。 2 つめは、アー
カイブをリストした後 -Wl,-no-whole-archive を使うことを忘れないよう
に してください。というのは、gcc は自分でアーカイブのリストをリンク
に追加することがあるので、これによる影響を受けないようにする必要 が
あるからです。
--wrap symbol
symbol に対して、ラッパ関数を使用します。すべての symbol への未定義
参照は、 "__wrap_symbol" へと解決されます。すべての "__real_symbol"
への未定義参照は、symbol へと解決されます。
こ れによって、システム関数に対するラッパを用意できます。ラッパ関数
は、"__wrap_symbol" という名前にする必要があります。ラッパ関数が シ
ス テ ム関数を呼びたい時には、 "__real_symbol" を呼び出すようにしま
す。
以下に簡単な例を示します:
void *
__wrap_malloc (int c)
{
printf ("malloc called with %ld\n", c);
return __real_malloc (c);
}
--wrap malloc を使用して、このファイルと一緒に他のコードをリンク し
た場合、すべての "malloc" 呼び出しは、関数 "__wrap_malloc" を代わり
に呼び出します。 "__wrap_malloc" 中の "__real_malloc" が、 本 当 の
"malloc" 関数を呼び出します。
同様にして "__real_malloc" 関数も用意しておくと、 --wrap オプション
が指定されなかった場合にもリンク は 成 功 し ま す。 そ の 場 合 に
は、"__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 ターゲットに固有のコマンドラインオプションを追加でサポートして い ま
す。値を取るオプションは、1 つの空白か等号で値との間を区切ります。
--add-stdcall-alias
このオプションが指定された場合、stdcall サフィックス (@nn) を持つシ
ンボルを、そのままサフィックスを取ってエクスポートします。
--base-file file
dlltool を使用して DLL を生成するのに必要なすべての再配置情報のベー
スアドレスをセーブするファイル名を file とします。
--dll
通 常の実行形式の代わりに DLL を生成します。 -shared を使用すること
もできますし、指定した ".def" ファイル中で "LIBRARY" を使用すること
もできます。
--enable-stdcall-fixup
--disable-stdcall-fixup
解 決不能なシンボルを見つけると、リンカは「曖昧リンク」を試みます。
これは、シンボル名の形式 (cdecl 対 stdcall) だけが異なる別の定義 済
み のシンボルを探し、一致したものへとリンクすることでシンボルを解決
します。例えば、未定義シンボル "_foo" は、関数 "_foo@12" へとリンク
され、未定義シンボル "_bar@16" は、関数 "_bar" へとリンクされるかも
知れません。リンカがこれを行う際に、警告を表示します。というの は、
通 常はリンクに失敗するべきであるからです。しかし、サードパーティの
DLL から生成されたインポートライブラリを使用するのに、この機能が 時
々 必 要 となることがあります。 --enable-stdcall-fixup を指定した場
合、この機能は完全に有効化され、警告は出力 さ れ ま せ ん。 --dis-
able-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 の非公開シンボルの拡張されたリ ス
トもあります (明らかに、これは Cygwin ターゲット用の DLL を構築する
時に適用されます)。これら Cygwin の除外されるシンボルは以下の通りで
す。 "_cygwin_dll_entry@12", "_cygwin_crt0_common@8", "_cygwin_non
cygwin_dll_entry@12", "_fmode", "_impure_ptr", "cygwin_attach_dll",
"cygwin_premain0", "cygwin_premain1", "cygwin_premain2", "cyg
win_premain3" そして "environ" です。
--exclude-symbols symbol,symbol,...
自動的にエクスポートすべきではないシンボルのリストを指定します。 そ
れらのシンボル名は、コンマもしくはコロンで区切られます。
--exclude-libs lib,lib,...
シ ンボルを自動的にエクスポートしないアーカイブライブラリのリストを
指定します。ライブラリ名は コ ン マ か コ ロ ン で 区 切 り ま す。
"--exclude-libs ALL" と指定すると、自動エクスポートのすべてのアーカ
イブライブラリからシンボルを除去します。明示的に .def ファイルに リ
ス ト さ れたシンボルは、本オプションにかかわらず、依然としてエクス
ポートされます。
--file-alignment
ファイルのアラインメントを指定します。ファイル中のセクションは、 常
に こ の倍数のファイルオフセットから始まります。デフォルトは 512 で
す。
--heap reserve
--heap reserve,commit
このプログラムのヒープ領域に使うために予約する (オプションでコ ミッ
ト する) メモリ量を指定します。デフォルトでは 1Mb が予約され、4K が
コミットされます。
--image-base value
プログラムもしくは DLL のベースアドレスとして、value を使用します。
これは、プログラムもしくは DLL がロードされた時に使われる、最も低位
のメモリ位置となります。再配置する必要性を軽減し、DLL の性能を向 上
さ せるため、各 DLL は一意なベースアドレスを持ち、他の DLL と重なら
ないようにすべきです。デフォルトでは、実行形式は 0x400000 で、DLL
は 0x10000000 です。
--kill-at
このオプションが指定されると、stdcall のサフィックス (@nn) は、エク
スポートされる前にシンボルから取り除かれます。
--major-image-version value
「イメージバージョン」のメジャーナンバを設定します。デフォルトは 1
です。
--major-os-version value
「OS バー ジョン」のメジャーナンバを設定します。デフォルトは 4 で
す。
--major-subsystem-version value
「サブシステムバージョン」のメジャーナンバを設定します。デフォル ト
は 4 です。
--minor-image-version value
「イメージバージョン」のマイナナンバを設定します。デフォルトは 0 で
す。
--minor-os-version value
「OS バージョン」のマイナナンバを設定します。デフォルトは 0 です。
--minor-subsystem-version value
「サブシステムバージョン」のマイナナンバを設定します。デフォルト は
0 です。
--output-def file
リ ン カは、生成する DLL に対応した DEF ファイルを含むファイル file
を作成します。この DEF ファイル ("*.def" と呼ばれます) は、 "dll
tool" を使ってインポートライブラリの作成に使用されたり、自動的にも
しくは暗黙にエクスポートされるシンボルへの参照として使用されたり し
ます。
--out-implib file
リンカは、生成する DLL に対応したインポートライブラリを含むファイル
file を作成します。このインポートライブラリ ("*.dll.a" も し く は
"*.a" と呼ばれます) は、生成された DLL をクライアントにリンクするの
に使われます。この動作によって、別に行う "dlltool" のインポートライ
ブラリ作成ステップを飛ばすことができます。
--enable-auto-image-base
"--image-base" 引数によって指定されなかった DLL のイメージベースを
自動的に選択します。 DLL 名から生成されるハッシュ値を使うこと に よ
り、各 DLL に対して一意のイメージベースが作成され、プログラムの実行
を遅延させるメモリ内での衝突と再配置を回避することができます。
--disable-auto-image-base
一意なイメージベースを自動的に作成しません。ユーザから指定された イ
メー ジベース ("--image-base") がない場合、プラットフォームのデフォ
ルトを使用します。
--dll-search-prefix string
インポートライブラリを使わずに DLL を動的 に リ ン ク す る 際 に、
"lib<basename>.dll" よりも "<string><basename>.dll" を先に検索しま
す。この動作によって、様々な "subplatforms" 用に作ら れ た native,
cygwin, uwin, pw などの DLL を、容易に区別することができます。例え
ば、一般的に Cygwin の DLL は、 "--dll-search-prefix=cyg" を使用 し
ます。
--enable-auto-import
DLL からインポートするデータに対して、"_symbol" を "__imp__symbol"
へと手の込んだリンクをし、それらの DATA をエクスポートする DLL の構
築に際して、必要に応じてサンク (thunk) したシンボルを作成します。一
般的にこれは、単にうまくいきます。 -- しかし、以下のようなメッ セー
ジが出ることがあります。
"variable '<var>' can't be auto-imported. Please read the documen
tation for ld's "--enable-auto-import" for details."
このメッセージは、最終的に 2 つの定数の和によって指定されるアドレス
に アクセスする(サブ)式がある場合に発生します (Win32 インポートテー
ブルは、1 つのみしか許していません)。これが起こり得る場合とい う の
は、DLL からインポートされた構造体変数のフィールドメンバへアクセス
する場合や、 DLL からインポートされた配列変数に対して定数のインデッ
ク スを使用する場合などがあります。すべての複数ワードの変数 (配列、
構造体、long long など) は、このエラー条件を引き起こすことがあり ま
す。 しかし、このエクスポートされた目障りな変数が、実際どんなデータ
タイプであっても、ld は 常にこれを検知し、警告を発し、停止します。
エクスポートされた変数のデータタイプが何であろうと、この問題を解 消
する方法がいくつかあります。
最 初の解決策は、定数の 1 つを強制的に変数としてしまうことです。 --
つまり、コンパイル時に不明で最適化不可とすることです。配列に対し て
は、2 つの方法が考えられます。 a) インデックスされる側 (配列のアド
レス) を変数とします。もしくは、b) 定数インデックスを変数とします。
従って以下のようになります:
extern type extern_array[];
extern_array[1] -->
{ volatile type *t=extern_array; t[1] }
もしくは
extern type extern_array[];
extern_array[1] -->
{ volatile int t=1; extern_array[t] }
構 造体 (や、他のほとんどの複数ワードデータタイプ) に対しては、構造
体そのもの (もしくは long long など) を変数とするのが、唯一の方法で
す。
extern struct s extern_struct;
extern_struct.field -->
{ volatile struct s *t=&extern_struct; t->field }
もしくは
extern long long extern_ll;
extern_ll -->
{ volatile long long * local_ll=&extern_ll; *local_ll }
この問題を扱う 2 番目の方法は、目障りなシンボルを「自動インポート」
するのを止めて、"__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){
/* This workaround is for win32 and cygwin; do not "optimize" */
volatile int *parr = arr;
printf("%d\n",parr[1]);
}
解決策 2:
--foo.h
/* Note: auto-export is assumed (no __declspec(dllexport)) */
#if (defined(_WIN32) || defined(__CYGWIN__)) && \
!(defined(FOO_BUILD_DLL) || defined(FOO_STATIC))
#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]);
}
この問題を回避する 3 番目の方法は、目障りな変数に対するアクセスを、
デー タを直接使うインタフェースではなく、関数のインタフェースを使う
ようライブラリを書き換えることです (例えば set_foo() と get_foo()
アクセス関数を使います)。
--disable-auto-import
DLL からインポートしたデータに対して、"_symbol" を "__imp__symbol"
へと、手の込んだリンクをしないようにします。
--enable-extra-pe-debug
自動インポートしたシンボルのサンクに関して、付加的なデバッグ情報 を
示します。
--section-alignment
セ クションのアラインメントを設定します。メモリ中のセクションは、常
にこの倍数のアドレスから始まります。デフォルトは 0x1000 です。
--stack reserve
--stack reserve,commit
プログラムのスタックに使うために予約する (オプションでコミットする)
メ モリ量を指定します。デフォルトでは 2Mb が予約され、4K がコミット
されます。
--subsystem which
--subsystem which:major
--subsystem which:major.minor
プログラムが実行されるサブシステムを指定します。 which の値で有効な
の は、"native", "windows", "console" そして "posix" です。オプショ
ンで、サブシステムのバージョンも指定することもできます。
環境変数
環境変数 "GNUTARGET", "LDEMULATION" そして "COLLECT_NO_DEMANGLE" を用い
て、ld の動作を変更することができます。
"GNUTARGET" は、-b (もしくはその別名の --format) が指定されなかった場
合、入力ファイルのオブジェクト形式を決定するのに使用されます。 そ の 値
は、 入力形式に対する BFD 名の 1 つでなくてはなりません。環境変数 "GNU
TARGET" が定義されていない場合、 ld は、そのターゲットに最も自然な形 式
を 使用します。 "GNUTARGET" が "default" に設定されていた場合、BFD は、
バイナリ入力ファイルを検査してインプット形式を決定しようとします。こ の
方 法は大抵の場合成功しますが、潜在的な曖昧さが残ります。というのは、オ
ブジェクトファイルの形式を指定するのに使われるマジックナンバが一意で あ
る こ と を保証する方法がないからです。しかし、それぞれのシステム上での
BFD の構成過程において、そのシステムの慣習的なフォーマットが検索リス ト
の 先頭に置かれるので、この曖昧さは慣習的なものに有利になるように解決さ
れます。
"LDEMULATION" は、-m オプションが指定されなかった場合、デフォルト の エ
ミュ レーションを決定するのに使用されます。エミュレーションは、リンカの
動作の様々な面、特にデフォルトのリンカスクリプトに影響を与えます。利 用
可 能なエミュレーションの一覧は、--verbose もしくは -V オプションを指定
することで表示できます。 -m オプションが使用されず、"LDEMULATION" 環 境
変 数も定義されていなかった場合、デフォルトのエミュレーションは、リンカ
がどのように構成されたかに依存します。
通常、リンカはデフォルトでシンボルをデマングルしま す。 し か し、"COL
LECT_NO_DEMANGLE" 環境変数が設定された場合は、デフォルトでシンボルをデ
マングルしません。この環境変数は、gcc のリンカラッパプログラムでも同 様
に 使用されています。デフォルトは、--demangle と --no-demangle オプショ
ンで上書きすることができます。
関連項目
ar(1), nm(1), objcopy(1), objdump(1), readelf(1) そして Info の binu-
tils と ld 項。
COPYRIGHT
Copyright (c) 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000, 2001 Free
Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.1 or
any later version published by the Free Software Foundation; with no
Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
Texts. A copy of the license is included in the section entitled "GNU
Free Documentation License".
謝辞
こ の日本語訳の作成にあたり、SRA の矢吹氏 (yabuki@sra.co.jp) の訳を参考
にさせていただきました。
3rd Berkeley Distribution 2002-10-30 LD(1)