| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GNU リンカ ld は, 広範な状況に対応することと
他のリンカとできるだけ互換性を維持することを目指している.
その結果, その動作を制御するのにたくさんの選択肢があることになる.
2.1 コマンド行オプション 2.2 環境変数
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
このリンカは, 多数のコマンド行オプションをサポートしているが,
実際には, そのほとんどがどの特定の文脈でも使われることがない.
例えば, ld の使われ方で多いのは, 標準の, サポートされている
Unix システム上で標準の Unix のオブジェクトファイルをリンクすることである.
このようなシステムで hello.o というファイルをリンクするには
以下のようにする.
ld -o output /lib/crt0.o hello.o -lc |
これは, ld に, ファイル /lib/crt0.o と hello.o,
ライブラリ libc.a をリンクした結果として output という
ファイルを生成することを指定する. ここで, ライブラリ libc.a は
標準の検索ディレクトリから得られる.
(以下の `-l' オプションの説明を参照のこと. )
ld のコマンド行オプションのいくつかは, コマンド行のどの位置で
指定しても良い.ただし,`-l' や `-T' のように,ファイルを
取るオプションは,オブジェクトファイルや他のオプションに対して,
コマンド行でそのオプションが現れた位置でそのファイルを読み込ませることを
強制する.
ファイルを取らないオプションは, 異なる引数を
与えて繰り返し指定しても, 繰り返す効果がないか, 前に(コマンド行で
左側に位置するもの)指定したそのオプションを上書きする.
複数回指定して意味のあるオプションは以下の説明で注意されている.
オプションでない引数はリンクして組み合わされるオブジェクトファイルか アーカイブである. コマンド行オプションの後に来ても, 前に来ても, 混じりあっても構わないが, オブジェクトファイル引数が, あるオプションとそのオプションの引数の 間に来てはいけない.
普通, リンカにはオブジェクトファイルを少なくとも一つ指定して起動するが, 他の形式のバイナリ入力ファイルを `-l', `-R' やスクリプト・ コマンド言語を使って指定することができる. バイナリ入力ファイルを 全く指定しないと, リンカは出力は一切生成せず, `No input files' というメッセージを出す.
リンカがオブジェクトファイルの形式を認識できない時は, それが
リンカ・スクリプトであると仮定する. このようにして指定したスクリプトは,
リンクに使われる主リンカ・スクリプト(デフォルトのリンカ・スクリプトか
`-T' を使って指定したもの)に対し追加を行なう. この機能により,
一見オブジェクトファイルやアーアカイブに見えるが, 実は単に何かのシンボル値
を定義していたり, INPUT や GROUP を使って他のオブジェクトを
ロードしているだけのファイルをリンクすることができる.
スクリプトをこのように指定するのは, 主となるリンカスクリプトに追加を
行ないときにだけ使うようにすべきである. SECTION や MEMORY
コマンドのように, 論理的には一回しか現れてはいけないコマンドを使い
たいのであれば, デフォルトのリンカスクリプトを `-T' オプションを
使って置き換えなければならない.
See section 3. リンカスクリプト.
一文字名のオプションついては, オプションの引数は空白を入れずに オプション文字の直後に続けるか, それを必要とする オプションの直後に別個の引数として置かなければならない.
複数文字からなる名前のオプションについては, オプション名の前に 一つか二つのダッシュが付く. 例えば, `-trace-symbol' と `--trace-symbol' は同じである. ただし,この規則の例外が一つある. 複数文字オプションのうち,小文字の 'o' ではじまるものは, ダッシュを二つつける必要がある.これは,`-o' についての混乱を 避けるためである.このため,例えば,`-omagic' は出力ファイル名を `magic' とする一方で,`--omagic' は出力ファイルに NMAGIC フラグを立てるのである.
複数文字オプションに対する引数はオプション名と 等号文字で区切るか, その引数を必要とするオプションの直後に別個の引数として 与えるかしなければならない. 例えば, `--trace-symbol foo' と `--trace-symbol=foo' は同じである. 複数文字のオプション名は, 一意的に決まるのであれば省略形が受け付けられる.
リンカが間接的に,コンパイラドライバ(例えば `gcc')から起動される 場合は,リンカのコマンド行オプションは全て前に `-Wl,' (あるいは, 特定のコンパイラドライバにとって適切なもの)を以下のように付けるべきある.
gcc -Wl,--startgroup foo.o bar.o -Wl,--endgroup |
これは重要である.そうしないと,コンパイラドライバがリンカのオプションを 黙って外してしまうことがあり,そのためリンクが正しくなくなることがある.
以下は,GNU リンカが受け付ける一般的なコマンド行オプションの表である.
-akeyword
-Aarchitecture
--architecture=architecture
ld では, このオプションは Intel 960 シリーズの
アーキテクチャの場合にのみ意味を持つ. Intel 960 用の ld の
コンフィギュレーションでは, 引数 architecture により 960 シリーズの
特定のアーキテクチャを指定し, 幾つかの保護機構を有効にし, アーカイブ
ライブラリの検索パスを変更する. 詳細については,
See section ld and the Intel 960 family.
ld の将来のリリースでは, 他のアーキテクチャについても
同様な機能をサポートする可能性がある.
-b input-format
--format=input-format
ld は, 複数種類のオブジェクトファイルをサポートするように
コンフィギュレーションすることが可能である. 読者のところの ld
がそのようにコンフィギュレーションされていれば, コマンド行で
`-b' オプションの後に指定することで, 入力オブジェクトファイルの
バイナリ形式を指定することができる. ld が複数のオブジェクト
ファイル形式に対応するようコンフィギュレーションされている場合でも,
普通は入力形式を指定する必要はない. ld は, デフォルトの
入力形式としてそれぞれの機種でもっとも良く使われる形式を想定するよう
コンフィギュレーションされている筈だからである. input-format は
テキスト文字列であり, BFD ライブラリがサポートしている特定の形式の
名前である. (`objdump -i' で利用可能なバイナリ形式の一覧を
得ることができる. )
See section 5. BFD.
このオプションを使って普通でないバイナリ形式のファイルをリンクする ことができる. また, `-b' を使って明示的に形式を切り替える こともできる(異なる形式のオブジェクトファイルを複数リンクする時). このためには, ある特定の形式のオブジェクトファイルのグループ毎に その前に `-b input-format' を指定する.
デフォルトの形式は環境変数 GNUTARGET から取られる.
See section 2.2 環境変数.
また, スクリプトから入力形式を定義することもできる.
それには TARGET コマンドを使う. 3.4.3 オブジェクトファイル形式を扱うコマンド を参照.
-c MRI-commandfile
--mri-script=MRI-commandfile
ld は別の形式の限定されたコマンド
言語で書かれたスクリプトファイルを受け付ける. この言語については
MRI Compatible Script Files で説明している.
MRI スクリプトファイルは `-c' オプションを使って指定する.
汎用の ld スクリプト言語で書かれたリンカ・スクリプトを実行
するには `-T' オプションを使う. MRI-cmdfile が存在しない場合,
ld は, `-L' オプションで指定されたディレクトリを探しにいく.
-d
-dc
-dp
FORCE_COMMON_ALLOCATION も同じ効果を持つ.
See section 3.4.4 その他のリンカスクリプトコマンド.
-e entry
--entry=entry
-E
--export-dynamic
このオプションを使わないと, 動的シンボル表はリンク時に指定した ある動的オブジェクトから参照されるシンボルのみを通常含むようになる.
dlopen を使って, 何か他の動的オブジェクトではなくて,
そのプログラムが定義しているシンボルを参照し返す必要があるような
動的オブジェクトをロードするなら, そのプログラム自体をリンクする時に
恐らくこのオプションを使う必要があるだろう.
-EB
-EL
-f
--auxiliary name
DT_AUXILIARY フィールドに
指定した名前を設定する. これにより, 動的リンカに対し,
共有オブジェクトのシンボル表を, 共有オブジェクト name の
シンボル表に対する補助的なフィルターとして使うべきであることを
知らせる.
後であるプログラムにこのフィルターオブジェクトをリンクし, そのプログラムを
実行すると, 動的リンカが DT_AUXILIARY フィールドを見ることになる.
動的リンカがそのフィルターオブジェクトのなんらかのシンボルを解決するなら,
まず最初に共有オブジェクト name に定義があるかどうかを検査する.
ない場合は, 代わりにフィルターオブジェクトの定義を使う.
共有オブジェクト name は存在する必要はない.
つまり, 共有オブジェクト name を使って, 特定の関数の別実装版を
提供することができる. おそらく, デバッグ目的や機種固有の性能目的の
版に使われるだろう.
このオプションは複数回指定して良い. DT_AUXILIARY エントリは,
コマンド行に現れた順に作られる.
-F name
--filter name
DT_FILTER フィールドに
指定された名前を設定する. これは動的にリンカに対し,
作成されようとしている共有オブジェクトのシンボル表を, 共有オブジェクト
name のシンボル表に対するフィルターとして使うことを指示する.
プログラムをこのフィルターオブジェクトとリンクし, そのプログラムを
実行すると, 動的リンカが DT_FILTER フィールドを見にいく.
動的リンカは通常通りフィルターオブジェクトのシンボル表に従って
シンボルの解決を行なうが, 実際にリンクするのは共有オブジェクト
name にある定義に対してである. つまり, フィルターオブジェクトを
使うと, オブジェクト name が提供するシンボルのサブセットを
選ぶことができるのである.
旧式のリンカの中には, -F オプションを使って, コンパイラツール群
全体で入力と出力オブジェクトファイルの両方のオブジェクトファイル形式を
指定するものがある.
GNU リンカはこれを行なうのに別の方法を取っている.
-b, --format, --oformat オプション, リンカスクリプト
の TARGET コマンド, それに環境変数 GNUTARGET である.
GNU リンカは ELF 共有オブジェクトを作っているのでないときは
-F オプションを無視する.
-fini name
_fini を呼び出すべき関数として使う.
-g
-Gvalue
--gpsize=value
-hname
-soname=name
DT_SONAME フィールドに
指定した名前を設定する. 実行形式を DT_SONAME フィールドのある
共有オブジェクトとリンクすると, その実行形式を実行させると,
動的リンカは, リンカに対して指定されたファイル名ではなく, DT_SONAME
フィールドで指定された共有オブジェクトをロードしようとする.
-i
-init name
_init を呼び出すべき関数として使う.
-larchive
--library=archive
ld は
パスのリストから, 指定された archive 毎に libarchive.a
が存在するかどうかを検索する.
共有ライブラリをサポートしているシステムでは, ld は,
拡張子が .a 以外のライブラリをも検索する. 特に, ELF システムと
SunOS では, ld はあるディレクトリでライブラリを検索する時,
拡張子が .a のものよりも先に拡張子が .so のものを
探す. 約束により, .so という拡張子は共有ライブラリを表す.
リンカは, アーカイブを一回だけ, コマンド行で指定された位置で 検索する. そのアーカイブがあるシンボルを定義しており, そのシンボルが コマンド行のアーカイブより前に現れるオブジェクトで未定義であれば, リンカがアーカイブから適切なファイルを取り込む. 一方, コマンド行で アーカイブより後に現れるオブジェクトに未定義シンボルがあっても, もう一度アーカイブを検索しには行かない.
アーカイブを複数回検索するようにリンカに仕向ける方法については
-( オプションのところを参照のこと.
同じアーカイブを複数回コマンド行に指定しても良い.
アーカイブのこういう検索の仕方は Unix のリンカでは普通である.
ただし, AIX 上で ld を使う場合は, AIX のリンカの動作との
違いに注意する必要がある.
-Lsearchdir
--library-path=searchdir
ld がアーカイブライブラリと ld 制御
スクリプトを検索するパスのリストに追加する.
このオプションはいくつ指定しても良い. ディレクトリが検索される順番は
コマンド行で指定された通りになり. コマンド行で指定したディレクトリは
デフォルトのディレクトリの前に検索される. 全ての -L オプションが,
全ての -l オプションに適用される. これはオプションの現れる
順序によらない.
検索パスのデフォルトの組(`-L' による指定がない場合)は,
ld がどのエミュレーションモードを使っているかに依存する.
ある場合にはどのようにコンフィギュレーションされたかにも依存する.
See section 2.2 環境変数.
検索パスはリンカスクリプトの中で SEARCH_DIR コマンドを
使って指定することもできる. この方法で指定したディレクトリは
コマンド行上リンカスクリプトが現れたところで検索される.
-memulation
`-m' オプションが指定されていない場合, 環境変数
LDEMULATION が定義されていればこれで指定したエミュレーションになる.
LDEMULATION も定義されていない場合, デフォルトのエミュレーションは
リンカのコンフィギュレーションに依存する.
-M
--print-map
-n
--nmagic
NMAGIC を設定する.
-N
--omagic
OMAGIC というマジック番号を設定する.
-o output
--output=output
ld が生成するプログラム名として output を使う.
このオプションを指定しないと, デフォルトで `a.out' が使われる.
スクリプトのコマンド OUTPUT を使っても出力ファイル名を
指定することができる.
-O level
-q
--emit-relocs
-r
--relocateable
ld への入力としても
使える出力ファイルを生成する. これは 部分リンクと呼ばれることも
多い. また, この副作用として, Unix の標準のマジック番号を使用している環境
では, 出力ファイルのマジック番号を OMAGIC に設定する.
このオプションを指定しないと, 絶対アドレス値に置き換えられたファイルが
生成する. C++ のプログラムをリンクする時は, このオプションを指定しても
コンストラクタに対する参照を解決しない. 解決するには, `-Ur' を
使う.
このオプションは `-i' に同じである.
-R filename
--just-symbols=filename
他の ELF リンカとの互換性のために, -R オプションの後に
ファイル名でなく, ディレクトリ名が続いた場合は, -rpath オプション
として扱われる.
-s
--strip-all
-S
--strip-debug
-t
--trace
ld が処理する順に入力ファイル名を表示する.
-T scriptfile
--script=scriptfile
ld のデフォルトのリンクスクリプトを
(追加するのではなく)置き換える. このため, scriptfile は
出力ファイルを記述するのに必要なあらゆるものを指定しなければならない.
リンカスクリプトに一回しか現れてはいけないコマンド, 例えば
SECTIONS コマンドや MEMORY コマンドを使う時は
このオプションを使用しなければならない. See section 3. リンカスクリプト.
scriptfile が存在しない場合, ld は先行する `-L'
オプションで指定されたディレクトリに探しに行く.
複数の `-T' オプションを指定すると蓄積されていく.
-u symbol
--undefined=symbol
EXTERN に同じである.
-Ur
ld への入力として使える
出力ファイルを生成する. C++ プログラムをリンクする時は,
`-Ur' は `-r' と違って, コンストラクタへの参照を
解決する. それ自身 `-Ur' を使ってリンクされたファイルに対しては
`-Ur' を使うことはできない. 一度コンストラクタ表が構築されてしまうと,
追加はできないのである. `-Ur' は最後の部分リンクにだけ使い,
それより前のリンクでは `-r' を使うこと.
--unique[=SECTION]
-v
--version
-V
ld のバージョン番号を表示する. -V はそれに加えて,
サポートされているエミュレーションの一覧を表示する.
-x
--discard-all
-X
--discard-locals
-y symbol
--trace-symbol=symbol
このオプションは, リンク時に未定義シンボルがでたものの, どこでそれを 参照しているか分からない時に役に立つ.
-Y path
-z keyword
initfirst, interpose,
loadfltr, nodefaultlib, nodelete, nodlopen,
nodump, now, origin である.
その他のキーワードは,Solaris との互換性のためにあり, 無視される.
initfirst は,オブジェクトに,実行時に,他のどのオブジェクトよりも
先に初期化しなければならないという印をつける.
interpose は,オブジェクトに,そのシンボル表を,主実行形式を
除く全てのシンボルの前に置くという印をつける.
loadfltr は,オブジェクトに,そのフィルターが実行時に直ちに
処理されるという印をつける.
nodefaultlib は,オブジェクトに,そのオブジェクトが依存するものを
検索する際に,デフォルトのライブラリ検索パスを無視するように印をつける.
nodelete は,オブジェクトに,実行時にアンロードされないよう印をつける.
nodlopen は,オブジェクトに,dlopen を適用できないと
印をつける.
nodump は,オブジェクトに,dldump でダンプ出来ないという
印をつける.
now は,オブジェクトに,実行時遅延バインディングでないという
印をつける.
origin は,オブジェクトに,$ORIGIN を含む可能性があるという
印をつける.
-( archives -)
--start-group archives --end-group
指定されたアーカイブに対し, 新たな未定義参照がなくなるまで繰り返し 検索が行なわれる. 普通, ひとつのアーカイブはコマンド行で指定された 順に一回だけ検索が行なわれる. そのアーカイブ中のシンボルが, コマンド行上後ろに現れるアーカイブ中のオブジェクトが参照する 未定義シンボルを解決するのに必要な場合は, リンカはその参照を 解決できない. アーカイブをグループ化することで, 全ての参照が 解決されるまでグループの全てのアーカイブが繰り返し検索される.
このオプションを使うと性能が非常に落ちるので, 二個以上のアーカイブ の間で循環的な参照があり, それが避けられない場合にだけ使うのが よいだろう.
-assert keyword
-Bdynamic
-dy
-call_shared
-l に対する検索に影響する.
-Bgroup
DT_FLAGS_1 エントリの DF_1_GROUP フラグを
設定する。これにより、実行時リンカが、このオブジェクトとその依存物内での
検索を、指定したグループ内でのみ実行するようになる。
--no-undefined が暗黙に指定される。
このオプションは、共有ライブラリをサポートする ELF プラットフォームでのみ
意味がある。
-Bstatic
-dn
-non_shared
-static
-l に対する検索に影響する.
-Bsymbolic
--check-sections
--no-check-sections
--cref
この相互参照表の形式は意図的に簡単なものにしているので, 必要なら スクリプトを書いて簡単に処理できる. シンボルは名前でソートして 表示される. シンボル毎にファイル名のリストが与えられる. シンボルが 定義されているなら, リストの先頭のファイルに定義がある. それ以外のファイルはそのシンボルへの参照を含む.
--defsym symbol=expression
+ または - を使っての
16進定数やシンボルの加算・減算を指定することができる.
もっと複雑な式が必要なら, スクリプトを書いてリンカコマンド言語を
使うことをお勧めする(see section Assignment: Symbol Definitions).
注意. symbol と等号("="), それに expression
の間には空白を置いてはいけない.
--demangle[=style]
--no-demangle
--dynamic-linker file
--embedded-relocs
-membedded-pic オプションを指定するとこのオプションに
変換される. このオプションを指定すると, リンカはあるテーブルを作る.
このテーブルを使って, 静的にポインタ値に初期化されているデータを,
全て実行時に再配置する. 詳細については `testsuite/ld-empic' を
参照のこと.
--force-exe-suffix
完全にリンクされた出力ファイルを無事構築できた時に, そのファイルに
.exe や .dll という拡張子がない場合, このオプションを
指定すると, リンカは出力ファイルを同じ名前に, 拡張子 .exe を
つけたファイルにコピーする.
このオプションは UNIX 用の Makefile を修正せずに Microsoft Windows 上で
使いたい時に役に立つ. Windows のバージョンによっては, 拡張子が
.exe になっていないイメージを実行することができないからである.
--no-gc-sections
--gc-sections
--help
--target-help
-Map mapfile
--no-keep-memory
ld は入力ファイルのシンボルテーブルをキャッシュすることで,
メモリ使用量よりも速度を優先する. このオプションは, メモリ使用量を
最小にすることを指定する. これは必要な都度シンボル表を読み直すことで
行なわれる. 大きな実行形式をリンクした時に ld がメモリを
使い果たすような場合に必要になる.
--no-undefined
-z defs
--allow-shlib-undefined
--no-warn-mismatch
ld は, 組合せになんらかの問題のある入力ファイルを一緒に
リンクするとエラーを出す. 例えば異なるプロセッサ用にコンパイルされた
ものだったり, エンディアンが異なっているなどの場合である.
このオプションを指定すると, ld はエラーを出さずにリンクを行なう.
このオプションは注意して使わなければならない. リンカの出すエラーが
適切でないことを保証する特別な処理を行なわなければならない.
--no-whole-archive
--whole-archive オプションを無効にする.
--noinhibit-exec
--oformat output-format
ld は, 複数の種類のオブジェクトファイルに対応するような
コンフィギュレーションとすることができる. ld がそのような
コンフィギュレーションになっている場合, `--oformat' オプションを
使って出力オブジェクトファイルのバイナリ形式を指定できる.
ld が複数のオブジェクトファイル形式に対応するような
コンフィギュレーションになっていても, 普通はこのオプションを指定する
必要はない. ld はデフォルトの出力形式として
それぞれの機種でもっとも使いでのある形式を生成するように
コンフィギュレーションされているはずだからである. output-format
はテキスト文字列であり, BFD ライブラリが対応している, 特定の形式の
名前である. (利用可能なバイナリ形式は `objdump -i' で知ることが
できる. ) スクリプトのコマンド OUTPUT_FORMAT を使っても
出力形式を指定することができるが, このオプションの方が優先する.
See section 5. BFD.
-qmagic
-Qy
--relax
ld and the H8/300.
See section ld and the Intel 960 family.
いくつかのプラットフォームでは, `--relax' オプションは, リンカがプログラム中のアドレス参照を解決する時に可能になる, グローバルな最適化を行なう. これは, 出力オブジェクトファイル中での アドレッシングモードの緩和と新しい命令の合成などである.
プラットフォームによっては,このようなリンク時のグローバル最適化により, 生成される実行形式のシンボリックデバッグが不可能になることがある. 不可能になることが知られているのは,松下 MN10200 と MN10300 プロセッサの シリーズである.
これがサポートされていないプラットフォームでは, `--relax' は受け付けた上で無視される.
--retain-symbols-file filename
`--retain-symbols-file' は, 未定義シンボルや再配置に必要なシンボルは 捨てない.
`--retain-symbols-file' はコマンド行上で一回しか指定できない. `-s' と `-S' を打ち消す.
-rpath dir
-rpath の引数は連結されて実行時リンカに渡される.
実行時リンカはそのパスを使って実行時に共有オブジェクトを探す.
-rpath オプションは明示的にリンクされる共有オブジェクトに
より必要とされる共有ライブラリを探すのにも使われる.
-rpath-link オプションの説明を参照のこと.
ELF 実行形式をリンクする時に -rpath を指定しないと,
環境変数 LD_RUN_PATH が定義されていればその内容が使われる.
-rpath オプションは SunOS でも使うことができる.
SunOS では, GNU リンカはデフォルトで, 指定された -L オプションを
全てつなぎ合わせて実行時検索パスを構成する. -rpath オプションが
指定されると, 実行時検索パスは, -L オプションを無視し,
-rpath オプションだけから作られる. これは gcc を使う時に
役に立つことがある. gcc は -L オプションをたくさん使い, それで
指定されたディレクトリがNFS マウントされたファイルシステム上に
あることも多いからである.
他の ELF リンカとの互換性のために, -R オプションの後にくるのが,
ファイル名ではなくてディレクトリ名である場合は, -rpath オプション
として取り扱われる.
-rpath-link DIR
ld -shared としてリンクした
場合に, 入力ファイルの一つとして共有ライブラリをリンクに含めた時に
起こる.
非共有, 再配置不可のリンクを行なう時にそのような依存関係に
出会うと, 明示的にリンクされていなければ, 自動的に必要な
共有ライブラリを探してリンクに含める.
その場合, -rpath-link オプションは最初に探すべきディレクトリの
組を指定する. -rpath-link オプションで一連のディレクトリ名を
指定するには, ディレクトリ名をコロンで区切って並べても良いし,
このオプションを複数回指定するのでも良い.
このオプションは注意して使う必要がある.共有ライブラリにハードコーディング された検索パスを上書きしてしまうからである.その場合, 実行時リンカが使うのとは異なる検索パスを意図せずに使ってしまう可能性がある.
GNU リンカは以下に示す検索パスから必要な共有ライブラリを探す.
-rpath-link オプションで指定されたディレクトリ.
-rpath オプションで指定されたディレクトリ.
-rpath と -rpath-link の違いは, -rpath オプションで
指定されたディレクトリは実行形式ファイルに取り込まれ, 実行時に
使われる. 一方 -rpath-link オプションはリンク時にだけ有効である.
これは,ネイティブのリンカ専用である.
-rpath オプションと -rpath-link オプション
が使われなかった場合は, 環境変数 LD_RUN_PATH の内容を
検索する.
これは,ネイティブのリンカ専用である.
-rpath オプションが使われなかった場合は,
-L オプションで指定されたディレクトリを探す.
LD_LIBRARY_PATH の
内容を探す
DT_RUNPATH
や DT_RPATH のディレクトリが, それを必要とする共有ライブラリ
に対し検索される. DT_RPATH のエントリは, DT_RUNPATH の
エントリが存在する場合は無視される.
必要な共有ライブラリが見つからない場合は, 警告を出してリンクを 続行する.
-shared
-Bshareable
-e オプションが使われず, 未定義シンボルがある場合は
自動的に共有ライブラリを作る.
--sort-common
--split-by-file [size]
--split-by-reloc に似ているが, 入力ファイル毎に size に
達した時に新規に出力セクションを作る. size は,指定しない場合は
デフォルトのサイズ 1 になる.
--split-by-reloc [count]
--stats
--traditional-format
ld の出力は既存のリンカの出力と
いくつかの点で異なっている. このオプションを指定すると,
既存のリンカと同じ形式を使用する.
例えば, SunOS では, ld は, シンボル文字列テーブルの重複した
エントリを一つにする. これにより, 完全なデバッグ情報付きの出力ファイルの
大きさを 30 パーセント以上小さくすることができる. 残念なことに,
SunOS の dbx はこうして作ったプログラムを読み込むことができない
(gdb なら何の問題もない). `--traditional-format' オプション
を指定すると, ld は重複したエントリを一つにしない.
--section-start sectionname=org
-Tbss org
-Tdata org
-Ttext org
bss, data, text
セグメントの開始アドレスとする. org は一個の 16 進整数でなければ
ならない.
他のリンカとの互換性のために, 通常 16 進値の頭につける `0x' は
省略してかまわない.
--dll-verbose
--verbose
ld のバージョン番号を表示し, サポートされている
リンカ・エミュレーションの一覧を出力する.
入力ファイルのどれがオープンできて, どれがオープンできないかを
表示する. デフォルトの組み込みスクリプトを使っているなら,
リンカスクリプトを表示する.
--version-script=version-scriptfile
--warn-common
グローバルシンボルには三つの種類がある. 以下に C 言語の例で説明する.
`--warn-common' オプションを指定すると, 5種類の警告を出す. どの警告も二行からなる. 一行目は問題となったシンボルについて説明し, 二行目は同じ名前の既に出現しているシンボルについて説明する. 二つのシンボルの片方あるいは両方がコモンシンボルとなる.
file(section): warning: common of `symbol' overridden by definition file(section): warning: defined here |
file(section): warning: definition of `symbol' overriding common file(section): warning: common is here |
file(section): warning: multiple common of `symbol' file(section): warning: previous common is here |
file(section): warning: common of `symbol' overridden by larger common file(section): warning: larger common is here |
file(section): warning: common of `symbol' overriding smaller common file(section): warning: smaller common is here |
--warn-constructors
--warn-multiple-gp
--warn-once
--warn-section-align
SECTIONS コマンドがそのセクションの開始アドレスを
指定していない場合である(see section 3.6 SECTIONS コマンド).
--whole-archive
--whole-archive オプションの後に指定された
アーカイブ毎に, そのアーカイブの中から必要なファイルを探すのではなく,
そのアーカイブ中の全てのオブジェクトファイルをリンクに含める.
これは, 普通, アーカイブファイルを共有ライブラリに変換する時に
使われる. アーカイブ中の全てのオブジェクトを強制的に
出来上がる共有ライブラリに取り込むのである. このオプションは複数回
指定可能である.
このオプションを gcc から使う場合の注意点が二つある.
第一に,gcc はこのオプションのことを知らないので,
-Wl,-whole-archive と指定する必要がある.
第二に,アーカイブを列挙した後で -Wl,-no-whole-archive を
指定するのを忘れないようにしないといけない.gcc は自分でアーカイブの
リストをリンクに追加するので,このオプションがそちらには影響しないように
する必要があるからである.
--wrap 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 と同じファイルに置いてはいけない.
同じファイルに置いてしまうと, GNU リンカが
malloc の呼び出しに変える前に, アセンブラがその呼び出しを
解決してしまうからである.
--enable-new-dtags
--disable-new-dtags
--enable-new-dtags を指定すると,新しい動的タグが必要に応じて作られる.
--disable-new-dtags を指定すると,新しい動的タグは作られない.
デフォルトでは,新しい動的タグは作られない.この二つのオプションは,
ELF システムでのみ使用できる.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
i386 PE リンカは,-shared オプションをサポートしており,
それを指定すると,出力は,通常の実行形式ではなく,
動的リンクライブラリ(DLL)になる.このオプションを使う時は,
出力を *.dll とすべきである.さらに,標準の *.def
ファイルを完全にサポートしているので,オブジェクトファイルのように
リンカのコマンド行に指定することができる(実際,シンボルをエクスポート
しているアーカイブの前に置き,通常のオブジェクトファイルのように,
リンクされることを保証すべきである.)
全ターゲットに共通のオプションに加えて,i386 PE リンカは, i386 PE ターゲットに固有のコマンド行を追加でサポートしている. 値を取るオプションは,空白一個か等号で値との間を区切る.
--add-stdcall-alias
--base-file file
--dll
-shared を使っても良いし,
指定した .def ファイルで LIBRARY を使っても良い.
--enable-stdcall-fixup
--disable-stdcall-fixup
_foo が関数 _foo@12 にリンクされ,
未定義シンボル _bar@16 が関数 _bar にリンクされるとしよう.
これをリンカが行なう時,警告を出す.普通はこれはリンクに失敗すべきだから
である.しかし,サードパーティの dll から生成したインポートライブラリを
使えるようにするのに,この機能が必要になることがある.
--enable-stdcall-fixup を指定すると,この機能が完全に有効になり,
警告は表示されない.--disable-stdcall-fixup を指定するとこの
機能は使えなくなり,このような不一致はエラーとなる.
--export-all-symbols
DllMain@12,
DllEntryPoint@0,impure_ptr は自動的には
エクスポートされない.
--exclude-symbols symbol,symbol,...
--file-alignment
--heap reserve
--heap reserve,commit
--image-base value
--kill-at
--major-image-version value
--major-os-version value
--major-subsystem-version value
--minor-image-version value
--minor-os-version value
--minor-subsystem-version value
--output-def file
*.def と呼ばれる)を使って,dlltool でインポート
ライブラリを作ったり,自動的あるいは暗黙にエクスポートされるシンボルへの
参照として使う.
--section-alignment
--stack reserve
--stack reserve,commit
--subsystem which
--subsystem which:major
--subsystem which:major.minor
native,windows,console,
posix である.オプションでサブシステムのバージョンを指定する
こともできる.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
環境変数 GNUTARGET, LDEMULATION, COLLECT_NO_DEMANGLE で
ld の動作を変えることができる.
`-b' (あるいはその別名の `-format') を指定しない場合は,
GNUTARGET により入力ファイルのオブジェクト形式が決まる.
GNUTARGET の値は, 入力ファイル形式の BFD 名の一つでなければ
ならない(see section 5. BFD). 環境変数 GNUTARGET が定義されていなければ,
ld はそのターゲットに自然な形式を使う. GNUTARGET が
default に設定されていれば, BFD はバイナリ形式の入力ファイルを
調べて入力フォーマットを決めようとする. この方法は大体成功するが,
潜在的な曖昧さが残る. オブジェクトファイル形式を指定するのに
使われるマジック番号が一意的であると保証する方法がないからである.
だが, 各システムでの BFD のコンギレーション手続きは, そのシステムに
自然な形式を検索リストの先頭に置くので, 曖昧さは自然なものに有利に
なるように解決される.
LDEMULATION は, `-m' オプションを指定しない場合の
デフォルトのエミュレーションを決定する. エミュレーションは
リンカの動作の色々な面, 特にデフォルトのリンカスクリプトに影響する.
利用できるエミュレーションを表示するには, `--verbose' オプションか
`-V' オプションを指定すれば良い. `-m' オプションを指定せず,
環境変数 LDEMULATION も定義されていないと, デフォルトの
エミュレーションはリンカがどのようにコンフィギュレーションされたかに
依存する.
通常,リンカはデフォルトでシンボルのデマングルを行なうが,
環境変数 COLLECT_NO_DEMANGLE が設定されていると,デフォルトでは
シンボルのデマングルを行なわなくなる.この環境変数は,リンカのラッパ
プログラムである gcc でも同様に使われている.このデフォルトは,
`--demangle' と `--no-demangle' オプションで変えることが
できる.
| [ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |