コマンドラインオプションのあまりの多さに怖気づくかもしれないが、実際の
作業で指定されるオプションは、ほとんどの場合少ない。例として
ld
の良く用いられる例、サポートされている標準的な Unix システムで標準
Unix のオブジェクトファイルを作成する場合を考えよう。このようなシステ
ムで
hello.o
ファイルをリンクする作業は以下のようになる。
$ ld -o output /lib/crt0.o hello.o -lc
この例では
ld
に
output
という名前のファイルを作成するように命令している。リンクするファイルは
/lib/crt0.o
、
hello.o
および標準的な検索ディレクトリにあるライブラリ
libc.a
である。
ld
のコマンドラインオプションは任意の順序で指定でき、必要なだけ繰り返すこ
とができる。オプションの繰り返しは、多くの場合最初のもの以外を無視する
か、先の指定 (コマンドラインの左にあるもの) を上書きするかになる。
\c
例外 (複数回の指定が意味を持つもの) は以下の通り。
-A 、 -b (またはその同義である -format )、
-defsym 、 -L 、 -l 、 -R 、 -u 。
リンクする (複数の) オブジェクトファイルは
objfile
として与えるが、これはコマンドラインでオプションの後、前、あるいは混ぜ
て置いても構わない。ただし
objfie
をオプションのフラグとその引数の間に置くことはできない。
通常リンカの実行には最低一つのオブジェクトファイルが指定されるが、異な
るフォーマットを持つバイナリファイルを
-l 、 -R
やスクリプトコマンド言語で指定することもできる。バイナリの入力ファイル
が一つも指定されない場合には、リンカは出力ファイルを作成せず、
` No input files' というメッセージを表示する。
オプションの引数はオプション文字の直後にスペースなしで続けることもでき
るし、オプションの次に別の引数として置くこともできる。
-A architecture
-
ld
のこのリリースでは、このオプションは Intel 960 アーキテクチャのファミ
リに対してのみ意味を持つ。このファミリ向けに設定された
ld
では、
architecture
引数は 960 ファミリのメンバーを示す 2 文字の名前のどれかを指定する。このオ
プションは出力ターゲットを指定し、入力ファイルにある非互換な命令全てに
対して警告メッセージを表示する。またリンカが書庫ライブラリを検索する
方法を変更し、指定されたアーキテクチャに特有のライブラリが利用できるよ
うにする。これは検索するファイルに、アーキテクチャを示す文字列を後置
したものを加えることによってなされる。
例えば使用している
ld
のコマンドラインに
-ACA
または
-ltry
があれば、リンカは組み込みの検索パスと -L で指定されたパスを
探し、以下のような名前のライブラリを見つけようとする。
try
libtry.a
tryca
libtryca.a
最初の二つはどんな場合でも検索されるものであり、後の二つは
-ACA
を用いたことによって加わったものである。
ld
の将来のリリースでは、同じような機能が他のアーキテクチャファミリでもサ
ポートされる可能性がある。
-A
オプションはコマンドラインで複数回用いられると、それぞれが意味を持つ。
ただしアーキテクチャファミリがターゲットの組み合わせを許す場合に限られ
る。それぞれの指定によって、
-l
で指定されたライブラリに名前のバリエーションを付けたものが検索される。
-
-b input-format
-
コマンドラインでこのオプションに続いて指定された入力オブジェクトファイ
ルのバイナリフォーマットを指定する。通常この指定は必要ない。
ld
はそれぞれのマシンで最も一般的なフォーマットをデフォルトの入力フォーマッ
トとするように設定されているからである。
input-format
はテキスト文字列で、 BFD ライブラリによってサポートされている特定のフォー
マットの名前である。
-format
input-format
はスクリプトコマンド
TARGET
と同じ効力を持つ。
一般的なバイナリフォーマットではないファイルをリンクする場合に、このオ
プションを指定することになる。また異なるフォーマットのオブジェクトファ
イルをリンクする際に、フォーマットを明示的に変更する目的に
-b
を使うこともできる。この際には
-b
input-foramt
をそれぞれのフォーマットに属するオブジェクトファイル群の前に挿入する。
デフォルトのフォーマットは環境変数
GNUTARGET
から取得される。スクリプトでコマンド
TARGET
を用いて入力フォーマットを設定することもできる。
-
-Bstatic
-
共有ライブラリに対するリンクをしない。これは共有ライブラリをサポートし
ているプラットフォームにおいてのみ意味を持つ。
-
-Bdynamic
-
動的ライブラリに対してリンクする。これは共有ライブラリをサポートしてい
るプラットフォームにおいてのみ意味を持つ。そのようなプラットフォームで
はこのオプションは通常デフォルトになっている。
-
-Bsymbolic
-
共有ライブラリを作る場合、グローバルシンボルへの参照を共有ライブラリ内
部の定義 (definition) と結合する。共有ライブラリにリンクされるプログ
ラムでは、通常この共有ライブラリ内部の定義を上書きすることができる。こ
のオプションが意味を持つのは共有ライブラリをサポートする ELF プラット
フォームのみである。
-
-c commandfile
-
commandfile
からリンクコマンドを読むように
ld
に指示する。これらのコマンドは
ld
デフォルトのリンクフォーマットを完全に上書きする (デフォルトに追加され
るわけではない)。
commandfile
ではターゲットフォーマットに関して必要な記述がすべてされていなければな
らない。
リンクコマンドのスクリプトは、コマンドラインでも指定できる。これにはス
クリプトの文字列をブラケット (`{' と `}') で囲う。
-
--cref
-
クロスリファレンスのテーブルを出力する。リンカのマップファイルが生成さ
れる場合には、クロスリファレンステーブルはマップファイルに出力される。
それ以外の場合には標準出力に表示される。
-
-d
-
-
-dc
-
-
-dp
-
これらの 3 つのオプションは等価である。複数の形式があるのは他のリンカ
との互換性のためである。これらのいずれかを指定すると、
ld
はリロケータブル出力ファイルが指定 (-r) された場合でも共通シン
ボルのための領域を割り当てる。スクリプトコマンド
FORCE_COMMON_ALLOCATION
が同じ効力を持つ。
-
-defsym symbol = expression
-
expression
によって与えられた絶対アドレスを含むグローバルシンボルを出力ファイルに
生成する。このオプションは必要なだけコマンドラインに指定でき、複数のシ
ンボルを定義することができる。
expression
の指定には簡単な算術もサポートされている。 16 進定数や存在する他のシン
ボルを与えたり、 + や - をそれらの間の足し引きに用いるこ
ともできる。より手の込んだ数式が必要な場合には、スクリプトでリンカコマ
ンド言語を用いることをすすめる。
-
-e entry\c
-
entry
をプログラムのエントリポイントを示す
シンボルとして取り扱う (デフォルトのエントリポイントを上書きする)。
デフォルトと他のエントリポイントの指定方法については ld の info の
*Note Entry Point:: を参照すること。
-
-embedded-relocs
-
このオプションが意味を持つのは GNU コンパイラやアセンブラの
-membedded-pic
オプションによって生成された MIPS embedded な PIC コードをリンクする場
合だけである。これはリンカにテーブルを生成させる。このテーブルは、ポイ
ンタ値に対して static に初期化された全てのデータを実行時にリロケートす
る際に用いられる。詳細は testsuite/ld-empic 内部のコードを参照のこと。
-
-E
-
-
-export-dynamic
-
ELF ファイルを作成する際に、全てのシンボルをダイナミックなシンボルテー
ブルに追加する。通常ダイナミックシンボルテーブルには動的なオブジェクト
によって用いられるシンボルのみが含まれている。このオプションは
dlopen
を使う場合などに必要となる。
-
-f name
-
-
--auxiliary name
-
ELF 共有オブジェクトを作成する際に、内部の DT_AUXILIARY フィールドを指
定した名前に設定する。この指定によって、ダイナミックリンカは扱っている
共有オブジェクトのシンボルテーブルを、他の共有オブジェクト
name
のシンボルテーブルの補助フィルタとして用いるようになる。
-
-F name
-
-
--filter name
-
ELF 共有オブジェクトを作成する際に、内部の DT_FILTER フィールドを指
定した名前に設定する。この指定によって、ダイナミックリンカはその
共有オブジェクトのシンボルテーブルを、他の共有オブジェクト
name
のシンボルテーブルのフィルタとして用いるようになる。
-
-format input-format
-
-b
input-format
と同義。
-
-g
-
受け付けるが無視される。他のツールとの互換性のために用意されている。
-
-G size\c
-
MIPS ECOFF において、 GP レジスタを用いて最適化するオブジェクトの最大
サイズを
size
に設定する。他のオブジェクトファイルフォーマットでは無視される。
-
-h name
-
-
-soname name
-
ELF 共有オブジェクトを作成するとき、内部の DT_SONAME フィールドを指定
した名前に設定する。実行ファイルが DT_SONAME フィールドを持つ共有オブ
ジェクトとリンクされると、これの実行時にダイナミックリンカは
DT_SONAME によって指定された共有オブジェクトをロードしようとする (通常
はリンカに対して指定されたファイルをロードする)。
-
--help
-
コマンドラインオプションの要約を標準出力に表示して終了する。このオプショ
ンと
--version
は、他の GNU プログラムとの互換性のためダッシュ (-) 二つで始まる。こ
れ以外のオプションは他のリンカとの互換性のためダッシュ一つで始まる。
-
-i
-
インクリメンタルリンクを実行する (オプション -r と同じ)。
-
-l ar\c
-
アーカイブファイル
ar
をリンクするファイルのリストに加える。このオプションは何回でも指定でき
る。
ld
は ar が指定されるごとに、 libar.a が見つかるまで検索パ
スを探す。
-
-L searchdir
-
このコマンドは
searchdir
を
ld
の書庫ライブラリの検索パスに追加する。このオプションは必要なだけ指定で
きる。
デフォルトの検索パス (-L が指定されなかったときの検索パス) は
ld
が用いているエミュレーションのモードに依存する。また設定に依存する場合
もある。リンクスクリプトでは
SEARCH_DIR
コマンドを用いてこのパスを設定することもできる。
-
-M
-
標準出力にリンクマップを表示する。リンクマップには
ld
によってマップされたシンボルの位置情報とグローバルな共通メモリ領域の
割当て情報が含まれている。
-
-Map mapfile\c
-
ファイル
mapfile
にリンクマップを出力する。リンクマップには
ld
によってマップされたシンボルの位置情報とグローバルな共通 storage の
割当て情報が含まれている。
-
-m emulation\c
-
リンカ
emulation
をエミュレートする。エミュレートできるもののリストは
--verbose
または
-V
で得られる。このオプションはコンパイル時のデフォルト (ld
の設定を行ったシステム向けのリンカ) を上書きする。
-
-N
-
text
と
data
セクションを読み書き可能にする。出力フォーマットが Unix スタイルのマジッ
ク・ナンバーをサポートしている場合は、出力ファイルに
OMAGIC
がマークされる。
-N
オプションを指定するとリンカは data セグメントのページ位置調整を行わな
い。
-
-n
-
text セグメントをリードオンリーにする。可能な場合は
NMAGIC
が書き込まれる。
-
-noinhibit-exec
-
通常リンカはリンク処理の途中でエラーになると出力ファイルを生成しない。
このフラグをもちいると致命的でないエラーの場合には出力ファイルを残すよ
うに指定できる。
-
-no-keep-memory
-
通常リンカはメモリ消費量よりも実行速度を優先するように最適化されている。
すなわち入力ファイルのシンボルテーブルがメモリにキャッシュされている。
このオプションを指定すると、メモリ消費を抑えるようにな
る (必要に応じてシンボルテーブルを読み直す)。このオプションは
大きな実行ファイルをリンクするとき、メモリを使い果たしてしまうよう
な場合に指定する必要がある。
-
-no-warn-mismatch
-
何らかの理由でマッチしない入力ファイルをいっしょにリンクしようとすると、
リンカは通常エラーになります。この原因としては、
それらの入力ファイルが異なるプロセッサ用に、
あるいは異なるエンディアン用にコンパイルされたなどが考えられます。
このオプションを指定すると、リンカはこの種の潜在的なエラーを
黙って許可します。このオプションは不用意に使うべきではありません。
リンカのエラーをどうしても避けたいような、
特殊な作業を行っているときに限るべきです。
-
-o output
-
output
は
ld
によって作成されるプログラムの名前である。このオプションが指定されなかっ
た場合は
a.out
がデフォルトとして用いられる。スクリプトコマンド
OUTPUT
でも出力ファイル名を指定できる。
-
-oformat output-format
-
出力されるオブジェクトファイルのバイナリフォーマットを指定する。通常は
このオプションは必要ない。
ld
でのデフォルトの出力フォーマットは、それぞれのマシンで最も普通のフォー
マットになるように設定されているからである。
output-format
はテキスト文字列で、 BFD ライブラリでサポートされている特定のフォーマッ
トの名前である。スクリプトコマンド
OUTPUT_FORMAT
でも出力フォーマットを指定できる。しかしこのオプションはスクリプトでの
指定を上書きする。
-
-R filename
-
シンボル名とそれらのアドレスを
filename
から読み込む。しかしそれらのリロケートや出力への追加は行わない。これに
よって出力ファイルでは、(他のプログラムで定義された) メモリ上の絶対ア
ドレスをシンボルを用いて参照できることになる。
-
-relax
-
機能はマシンに依存する。現在では H8/300 でのみサポートされている。
プラットフォームによっては、このオプションを指定するとグローバルな最適
化を行う場合もある。これはリンカがプログラムのアドレスを置き換える (出
力されるオブジェクトファイルのアドレスモードを relax させたり新しい命
令を同期させる) 場合に可能となる。
サポートされていないプラットフォームでは、
-relax
は受け付けられるが何も起こらない。
-
-r
-
リロケータブルな出力を生成する。すなわち再び
ld
の入力として用いることができるようなファイルを生成する。これはしばしば
部分 (partial) リンクと呼ばれる。また標準 Unix の
マジック・ナンバーをサポートする環境では、このオプションは出力ファイル
のマジック・ナンバーを
OMAGIC
にする。このオプションが指定されなかった場合は、完全なファイルが生成さ
れる。 C++ プログラムをリンクする場合、このオプションはコンストラクタ
への参照を解決しない。 C++ の場合には代わりに
-Ur
を用いることができる。
このオプションは
-i
と同じ。
-
-rpath directory
-
ディレクトリを実行時ライブラリの検索パスに追加する。これは ELF の実
行ファイルを共有オブジェクトとリンクするときに用いられる。
-rpath
の引き数は全て結合され、ダイナミックリンカに渡される。ダイナミックリン
カは、これを用いてロードする共有オブジェクトを実行時に決定する。
-rpath
オプションはリンクに明示的に含まれている共有オブジェクトによって必要と
される別の共有オブジェクトを指定するのに用いることもできる。
-rpath-link
オプションの説明を見よ。 ELF 実行ファイルの
-rpath
が指定されない場合には、 (指定されていれば) 環境変数
LD_RUN_PATH
の値が用いられる。
-rpath
オプションは SunOS で用いることもできる。 SunOS のデフォルトでは、リン
カは実行時の検索パスを
-L
オプションで与えられたパスから生成する。
-rpath
が用いられると、実行時の検索パスは
-rpath
オプションで与えられたパスのみから生成され、
-L
オプションは無視される。これは gcc を使っていて、
-L
がたくさん指定されてしまう (これらは NFS マウントされたファイルシ
ステムかもしれない) 場合などに便利である。
-
-rpath-link directory
-
ELF か SunOS を用いている場合、ある共有ライブラリが別の共有ライブラリ
を必要とする場合がある。これは
ld -shared
によるリンクで入力ファイルに共有ライブラリが含まれている場合に起こる。
リンカが非共有 (非リロケータブル) なリンクを行っているときに、このよう
な依存関係に遭遇すると、リンカは自動的にその必要とされている共有ライブ
ラリも (明示されていなくても) リンクしてしまおうとする。このような場合
に
-rpath-link
オプションは検索する最初のディレクトリセットを指定する。
-rpath-link
オプションではディレクトリ名の並びをコロンで区切って一度に指定すること
もできるし、複数回用いて指定することもできる。
必要な共有ライブラリが見つからないと、リンカは警告を出してリンク処理を
継続しようとする。
-
-S
-
出力ファイルからデバッガのシンボル情報を削除する (全てのシンボルではな
い)。
-
-s
-
出力ファイルから全てのシンボル情報を削除する。
-
-shared
-
共有ライブラリを生成する。現在のところ ELF と SunOS プラットフォームで
のみサポートされている (実際には SunOS では不要である。なぜならリンカ
は未定義シンボルが存在していたり
-e
オプションが指定されている場合には自動的に共有ライブラリを生成するから
である)。
-
-sort-common
-
通常
ld
がグローバルな共通シンボルをそれぞれの出力セクションに配置するにあたっ
ては、それらはサイズによってソートされる。まず 1 バイト変数のシンボル、
ついで 2 バイト、 4 バイト変数のシンボル、最後にそれ以外のものが並ぶ。
このオプションはアラインメントによって生じてしまうシンボル間のギャップ
を防止する。このオプションはソートを行わないようにする。
-
-split-by-reloc count
-
出力ファイルに余分なセクションを生成して、ファイル中のそれぞれの出力セ
クションが
count
以上のリロケーションを含まないようにする。これは COFF オブジェクトファ
イルフォーマットの巨大なリロケータブルファイルを、リアルタイムカーネル
にダウンロードする場合などに役に立つ。 COFF はセクションあたり 65535
以上のリロケーションを持てないからである。任意のセクションをサポートし
ていないフォーマットでは、このオプションは機能しないことに注意。リンカ
はそれぞれの入力セクションを分割して再配置するわけではない。したがって
入力ファイルのセクションに
count
以上のリロケーションを含むものがあれば、それに対応してそれだけのリロケー
ションを持った出力セクションは作成されてしまう。
-
-split-by-file
-
-split-by-reloc
と似ているが、それぞれの入力ファイルに対して新たな出力セクショ
ンを生成する。
-
-Tbss org\c
-
-
-Tdata org\c
-
-
-Ttext org\c
-
それぞれ出力ファイルの bss、 data、 text セグメント
に対して
org
を開始アドレスにする。
org
は 16 進の整数でなければならない。
-
-T commandfile
-
-c \c
commandfile
と等価である。他のツールとの互換性のために用意された。
-
-t
-
入力ファイルを
ld
が処理するごとに、ファイルの名前を表示する。
-
-u sym
-
sym
を出力ファイルに未定義なシンボルとして挿入する。例えばこれは、標準ライ
ブラリから付加的なモジュールをリンクするトリガに使うことができる。
-u
は必要な未定義シンボルの数だけ繰り返すことができる。
-
-Ur
-
C++ プログラム以外では、このオプションは
-r
と等価であり、リロケータブルな出力を生成する (つまり再び
ld
の入力ファイルに用いることのできるファイルを出力する)。
C++ プログラムをリンクする際には、
-Ur
は
-r
と異なり、コンストラクタへの参照を解決する。
-
--verbose
-
ld
のバージョン番号を表示し、サポートされているエミュレーションをリストす
る。入力ファイルがそれぞれオープンできるかどうかも表示する。
-
-v, -V
-
ld
のバージョン番号を表示する。
-V
はサポートされているエミュレーションもリストする。
-
--version
-
ld
のバージョン番号を表示して終了する。
-
-warn-common
-
共通シンボルが他の共通シンボルやシンボル定義と結合されている場合に警告
を発する。 Unix のリンカはこの点には比較的寛容であるが、他の OS のリン
カにはそうでないものもある。このオプションはグローバルシンボルを結合す
ることによって生じる問題点を見つける手がかりになるかもしれない。
-
-warn-constructors
-
グローバルコンストラクタが用いられたら警告を発する。これが意味を持つオ
ブジェクトファイルフォーマットは少ない。 COFF や ELF では、リンカはグ
ローバルコンストラクタを検出することができない。
-
-warn-multiple-gp
-
出力ファイルに複数のグローバルなポインタ値が必要な場合に警告を発する。
このオプションが意味を持つのは、 Alpha のような特殊なプロセッサだけで
ある。
-
-warn-once
-
未定義シンボルに関する警告をシンボルごとに一度だけにする。デフォルトで
はそのシンボルを参照するモジュール一つについて一回警告が出る。
-
-warn-section-align
-
出力セクションのアドレスがアラインメントのために変更された場合に
警告を出す。通常アラインメントは入力セクションによって設定される。
アドレスは明示的に指定されなかった場合 (つまり SECTIONS コマンドが
セクションのスタートアドレスを指定しなかった場合) にのみ変更されうる。
-
--whole-archive
-
コマンドラインでこのオプション以降に指定されたそれぞれの書庫に対して、
書庫内部の全てのオブジェクトファイルをリンクする (デフォルトでは書庫か
ら必要なオブジェクトファイルを検索する)。これは通常書庫ファイルを共有
ライブラリに変えるとき、内部のオブジェクトを全て共有ライブラリに含め
るために指定される。
-
--no-whole-archive
-
コマンドラインでこのオプション以降に現われる書庫に対して
--whole-archive
オプションの効果を無効にする。
-
--wrap symbol
-
symbol
に対してラッパ機能を用いる。
symbol
への未定義な参照は全て
__wrap_ symbol
として解決される。また
__REAL_ symbol
への未定義な参照はすべて
symbol
として解決される。
-
-X
-
一時的なローカルシンボルをすべて削除する。ほとんどのターゲットでは、これは
`L' で始まるローカルシンボルを意味する。
-
-x
-
ローカルシンボルを全て削除する。